Socket demo
一、客户端
1.流程
申请sockfd---->设置连接信息---->连接(使用sockfd+连接信息)---->发送或接受信息
2.代码
int main(int argc, char *argv[])
{
int sockfd = socket(PF_INET, SOCK_STREAM, 0);
assert(sockfd >= 0);
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(port);
inet_pton(AF_INET, serverIp, &address.sin_addr);
if (connect(sockfd, (struct sockaddr *)&address, sizeof(address)) < 0)
{
close(sockfd);
sockfd = 0;
return -1;
}
char buf[1024];
memset(buf,0,sizeof(buf));
sprintf(buf, "the number is 0");
send(sockfd, buf, sizeof(buf), 0);
memset(buf,0,sizeof(buf));
recv(sockfd, buf, 1024, 0);
return 0;
}
二、服务端
1.流程
申请sockfd---->设置地址信息---->将地址信息绑定到sockfd上---->监听sockfd---->accept获得客户端---->通信
2.代码
int main(int argc, char *argv[]){
int listenfd = socket(PF_INET, SOCK_STREAM|SOCK_NONBLOCK, 0);
assert(listenfd >= 0);
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_ANY);
address.sin_port = htons(port);
if (bind(listenfd, (struct sockaddr *)&address, sizeof(address)) != 0)
{
close(listenfd);
listenfd = 0;
return -1;
}
if (listen(listenfd, 10) != 0)
{
close(listenfd);
listenfd = 0;
return -1;
}
int clientfd = accept4(listenfd, (struct sockaddr *)&clientAddress, &clientLength,SOCK_NONBLOCK);
}
三、Others
recv()和send()默认阻塞模式,如需设置非阻塞模式则在sockfd申请时添加参数SOCK_NONBLOCK,如:
int listenfd = socket(PF_INET, SOCK_STREAM|SOCK_NONBLOCK, 0)
int clientfd = accept4(listenfd, (struct sockaddr *)&clientAddress, &clientLength,SOCK_NONBLOCK);
accept4函数相比accept函数多了一个设置能设置阻塞的参数