linux下c编程socket通信

来源:互联网 发布:java volatile 原子性 编辑:程序博客网 时间:2024/06/05 04:29

1、服务器端

建立socket。int sockfd = socket(AF_FAMILY,SOCK_STREAM,0);

绑定IP和端口。bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));

开启listen。listen(sockfd,5);

循环accept。int newfd = accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);

读写数据。read(newfd,buf,bufsize); write(newfd,buf,sizeof(buf));

>>注意绿色部分,最后一个参数的区别<<

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>int main(){int sockfd,sin_size,newfd;struct sockaddr_in serveraddr,clientaddr;char databuf[1024];//create server socketif((sockfd=socket(AF_INET,SOCK_STREAM,0)) == 0)exit(0);//bind ip and portserveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9999);serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr)) == -1)exit(0);//listenif(listen(sockfd,5) == -1)exit(0);//acceptwhile(1){sin_size = sizeof(struct sockaddr_in);if((newfd=accept(sockfd,(struct sockaddr *)&clientaddr,&sin_size)) == -1)exit(0);//read dataread(newfd,databuf,1024);//write datawrite(newfd,databuf,strlen(databuf));}return 0;}

2、客户端

建立socket。int sockfd = socket(AF_FAMILY,SOCK_STREAM,0);

指定服务器IP和端口。

连接服务器。connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));

收发数据。

>>注意绿色部分与服务器端accept和bind的异同<<

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>int main(){struct sockaddr_in saddr,caddr;int sockfd;char databuf[1024];//create socketif((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1)exit(0);//init server ip and portsaddr.sin_family = AF_INET;saddr.sin_port = htons(9999);saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//connectif(connect(sockfd,(struct sockaddr *)(&saddr),sizeof(struct sockaddr)) == -1)exit(0);write(sockfd,"i am client",11);read(sockfd,databuf,1024);printf("%s\n",databuf);return 0;}

3、头文件解释

htons()、htonl()函数出自netinet.h。

inet_addr()函数出自arpa/inet.h。

read()、write()函数出自unistd.h。

struct sockaddr_in、struct sockaddr出自sys/socket.h。


0 0
原创粉丝点击