赞
踩
开发环境:CentOS7
编译:gcc
先运行服务端,再运行客户端。连接完毕,客户端可以发送消息。
客户端发送了 “1”,服务端收到消息并打印,此时轮到服务端发送消息。
服务端发送消息“2”,客户端收到消息也进行打印,之后不断重复。
在客户端/服务端等待对方发送消息的同时,并没有限制其继续输入消息。所以会有下图的这种效果,等待过程中发送的消息会在对方发送消息后,给对方发送过去。
全部收完后,又恢复刚开始的样子。(可能会存在上限【类似缓冲区的东西(猜测)】,有待测试)
代码中使用了gets,可以更改为 fgets(buf,1000,stdin);
服务端 server.c
#include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> int main() { printf("服务器创建socket...\n"); int sockfd = socket(AF_INET,SOCK_STREAM,0); if(0 > sockfd) { perror("socket"); return -1; } printf("准备地址...\n"); struct sockaddr_in addr = {}; addr.sin_family = AF_INET; addr.sin_port = htons(7777); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); socklen_t len = sizeof(addr); printf("绑定socket与地址...\n"); if(bind(sockfd,(struct sockaddr*)&addr,len)) { perror("bind"); return -1; } printf("设置监听...\n"); if(listen(sockfd,5)) { perror("listen"); return -1; } printf("等待客户端连接...\n"); for(;;) { struct sockaddr_in addrcli = {}; int clifd = accept(sockfd,(struct sockaddr*)&addrcli,&len); if(0 > clifd) { perror("accept"); continue; } if(0 == fork()) { char buf[1024] = {}; for(;;) { printf("read:"); read(clifd,buf,sizeof(buf)); printf("%s\n",buf); if(0 == strcmp("quit",buf)) { close(clifd); return 0; } printf(">"); gets(buf); write(clifd,buf,strlen(buf)+1); } } } close(sockfd); }
客户端 client.c
#include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> int main() { printf("服务器创建socket...\n"); int sockfd = socket(AF_INET,SOCK_STREAM,0); if(0 > sockfd) { perror("socket"); return -1; } printf("准备地址...\n"); struct sockaddr_in addr = {}; addr.sin_family = AF_INET; addr.sin_port = htons(7777); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); socklen_t len = sizeof(addr); printf("绑定连接服务器...\n"); if(connect(sockfd,(struct sockaddr*)&addr,len)) { perror("bind"); return -1; } for(;;) { char buf[1024] = {}; printf(">"); gets(buf); write(sockfd,buf,strlen(buf)+1); if(0 == strcmp("quit",buf)) { printf("通信结束!\n"); break; } printf("read:"); read(sockfd,buf,sizeof(buf)); printf("%s\n",buf); } close(sockfd); }
操作系统:win10
编译环境:mingw (gcc)
编译 gcc server.c -lwsock32 -o server
// 编译 gcc server.c -lwsock32 -o server #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll int main(int argv, char* argc[]) { //初始化 WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); //创建套接字 SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //绑定套接字 struct sockaddr_in sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节用0填充 sockAddr.sin_family = PF_INET; //使用ipv4 sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); sockAddr.sin_port = htons(8888); //端口 bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)); //进入监听状态 listen(servSock, 20); //接收客户端消息 SOCKADDR clntAddr; int nSize = sizeof(SOCKADDR); SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize); char buf[1024] = {0}; for(;;) { printf("read:"); recv(clntSock, buf, 1024, 0); printf("%s\n",buf); if(0 == strcmp("quit", buf)) { break; } printf(">"); gets(buf); send(clntSock, buf, strlen(buf) + sizeof(char), 0); } //关闭套接字 closesocket(clntSock); closesocket(servSock); //终止dll使用 WSACleanup(); return 0; }
// 编译 gcc client.c -lwsock32 -o client #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") int main(int argv, char* argc[]) { //初始化 WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); //创建套接字 SOCKET clntSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //向服务器发送消息 struct sockaddr_in sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充 sockAddr.sin_family = PF_INET; sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); sockAddr.sin_port = htons(8888); connect(clntSock, (SOCKADDR*)& sockAddr, sizeof(SOCKADDR)); char buf[1024] = {0}; for(;;) { printf(">"); gets(buf); send(clntSock, buf, strlen(buf) + sizeof(char), 0); if(0 == strcmp("quit",buf)) { printf("通信结束!\n"); break; } printf("read:"); recv(clntSock, buf, 1024, 0); printf("%s\n",buf); } //关闭套接字 closesocket(clntSock); //终止dll WSACleanup(); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。