linux下socket编程简单示例

时间:2022-12-14 22:30:10

Linux下socket简单应用

系统调用接口函数


1. int socket(int protofamily, int type, int protocol);//返回sockfd

    socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。

2. int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。

3. int listen(int sockfd, int backlog); //服务器端调用,监听

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //客户端调用

如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

4. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返 回连接connect_fd

服务端调用,用来接收存放于listeningredients队列中的连接。最新版函数:int accept4(int sockfd, struct sockaddr *addr,socklen_t *addrlen, int flags);。可以直接在最后一个标志位设置相关参数,减少fcntl函数的调用直接在最后的标志位设置SOCK_NONBLOCK和SOCK_CLOEXEC属性.

5. ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count)

linux的io系统调用接口函数

ssize_t为有符号整形。

server端简单示例:

/*************************************************************************
> File Name: socketTest.cpp
> Author:fangzhi chen
> Mail:1242692800@qq.com
> Created Time: 2016年09月19日 星期一 21时16分19秒
************************************************************************/


#include<stdio.h>
#include <unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<errno.h>

int main(){
int serverFd=socket(AF_INET,SOCK_STREAM|SOCK_CLOEXEC,0);
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8002);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(serverFd,(struct sockaddr *)(&serverAddr),sizeof(serverAddr))<0)
perror("socket::bind");
if(listen(serverFd,20)<0)
perror("socket::listen");
struct sockaddr_in clientAddr;
socklen_t clientAddrLen;
int sock_fd;
char buf[10];
if((sock_fd=accept(serverFd,(struct sockaddr *)(&clientAddr),&clientAddrLen))<0)
perror("socket::accept");
while(read(sock_fd,buf,10)){
printf("%s",buf);
//write(sock_fd,buf,10);
}
return 0;
}

客户端简单实例:

/*************************************************************************
> File Name: socketClient.cpp
> Author:fangzhi chen
> Mail:1242692800@qq.com
> Created Time: 2016年09月20日 星期二 16时31分28秒
************************************************************************/

#include<unistd.h>
#include<string.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<arpa/inet.h>


int main(){
int clientFd;
if((clientFd=socket(AF_INET, SOCK_STREAM, 0)) < 0)
¦ perror("socket::create");
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8002);

// serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_addr.s_addr = inet_addr("10.26.230.129");

perror("socket::connect");
if(connect(clientFd, (struct sockaddr*)&serverAddr, sizeof(serverAddr))<0)
perror("socket::connect");
char buf[100];
while(1){
int n = read(0,buf,100);
write(clientFd,buf,n);
}
return 0;


}