Linux 下 TCP C代码

来源:互联网 发布:nz挂机软件 编辑:程序博客网 时间:2024/06/14 14:05
/*socket tcp*/#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>// define the port #define SERVER_PORT 5555int main(){int serverSocket;struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer[200];int iDataNum;int pid;//创建soket //打开一个网络接口,AS_INET 表示使用的是ipv4 //对于tcp 使用sock_stream 对于udp sock_sgramif((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 1;}//soket 初始化bzero(&server_addr, sizeof(server_addr));//协议type 使用ipv4 指定server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT); //初始化接口//网络地址为inaddr_any 表示本地任意ip地址server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //bindin  serverSocket  接口 ip if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("connect");return 1;}//表示最多允许5个客户端连接服务器if(listen(serverSocket, 5) < 0) {perror("listen");return 1;}while(1){printf("Listening on port: %d\n", SERVER_PORT);client = accept(serverSocket, (struct sockaddr*)&clientAddr, (socklen_t*)&addr_len);if(client < 0){perror("accept");continue;}pid = fork();if(pid<0){printf("connot create pid ");close(client);exit(1);}//产生一个进程if(pid==0){close(serverSocket);printf("\nrecv client data...n");printf("IP is %s\n", inet_ntoa(clientAddr.sin_addr));printf("Port is %d\n", htons(clientAddr.sin_port));while(1){/*       client: 接收端套接字描述符        buff:   用来存放recv函数接收到的数据的缓冲区 也就是客户端发过来的数据        1024: 指明buff的长度        flags:   一般置为0*/iDataNum = recv(client, buffer, 1024, 0);if(iDataNum < 0){perror("recv");continue;}buffer[iDataNum] = '\0';if(strcmp(buffer, "quit") == 0)break;printf("%drecv data is %s\n", iDataNum, buffer);/* client:指定发送端套接字描述符。 buff:    存放要发送数据的缓冲区 iDataNum:  实际要改善的数据的字节数 flags:   一般设置为0*///把接受到的数据有发送给了客户端send(client, buffer, iDataNum, 0);}}else {close(client);}}return 0;}

/********************************************客户端代码*********************************************************/

/*socket tcp客户端*/#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#define SERVER_PORT 5555int main(){int clientSocket;struct sockaddr_in serverAddr;char sendbuf[200];char recvbuf[200];int iDataNum;if((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 1;}//初始化socket serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(SERVER_PORT);serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");//连接if(connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){perror("connect");return 1;}printf("connect with destination host...\n");while(1){printf("Input your world:>");scanf("%s", sendbuf);printf("\n");//客户端发送数据(字符串) 到服务器端send(clientSocket, sendbuf, strlen(sendbuf), 0);if(strcmp(sendbuf, "quit") == 0)break;//接受到从服务器发送过来的数据iDataNum = recv(clientSocket, recvbuf, 200, 0);recvbuf[iDataNum] = '\0';printf("recv data of my world is: %s\n", recvbuf);}close(clientSocket);return 0;}



备注 : 多开几个terminal 连接server ,我们使用了三个客户端
使用下面命令可以看到
[mike@localhost ~]$ netstat -tnp | grep 5555
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:42359             127.0.0.1:5555              ESTABLISHED -                   
tcp        0      0 127.0.0.1:42361             127.0.0.1:5555              ESTABLISHED 6236/./client       
tcp        0      0 127.0.0.1:5555              127.0.0.1:42360             ESTABLISHED -                   
tcp        0      0 127.0.0.1:5555              127.0.0.1:42359             ESTABLISHED -                   
tcp        0      0 127.0.0.1:5555              127.0.0.1:42361             ESTABLISHED -                   
tcp        0      0 127.0.0.1:42360             127.0.0.1:5555              ESTA

看到有六个tcp连接,3个为客户端的请求,如果关闭一个客户端
[mike@localhost ~]$ netstat -tnp | grep 5555
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:42359             127.0.0.1:5555              ESTABLISHED -                   
tcp        0      0 127.0.0.1:42361             127.0.0.1:5555              FIN_WAIT2   -                   
tcp        0      0 127.0.0.1:5555              127.0.0.1:42360             ESTABLISHED -                   
tcp        0      0 127.0.0.1:5555              127.0.0.1:42359             ESTABLISHED -                   
tcp        1      0 127.0.0.1:5555              127.0.0.1:42361             CLOSE_WAIT  -                   
tcp        0      0 127.0.0.1:42360             127.0.0.1:5555              ESTABLISHED 6189/./client 
0 0
原创粉丝点击