客户端
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <string.h> #include<arpa/inet.h> #include <error.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> int main() { //第一步:初始化一个socket实例 int st = socket(AF_INET, SOCK_STREAM, 0); //第二步:定义一个IP地址结构并设置值 struct sockaddr_in addr; //内存初始化,将addr变量指向的内存签n个字节用0进行初始化填充 memset(&addr, 0, sizeof(addr)); //设置采用的协议为TCP/IP协议 addr.sin_family = AF_INET; //设置端口号 addr.sin_port = htons(8080); //设置IP地址 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //第三步:开始连接服务端 if (connect(st, (struct sockaddr *)&addr, sizeof(addr)) == -1) { printf("connect fail %s ", strerror(errno)); return EXIT_FAILURE; } //第四步:初始化要发送的信息并且通过send函数发送数据 char s[1024]; memset(s, 0, sizeof(s)); strcpy(s, "hello world"); if (send(st,s,strlen(s),0)==-1) { printf("send fail %s ", strerror(errno)); return EXIT_FAILURE; } close(st); getchar(); return EXIT_SUCCESS; }
服务端
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <string.h> #include<arpa/inet.h> #include <error.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> int main() { int st = socket(AF_INET, SOCK_STREAM, 0); int on = 0; if (setsockopt(st, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) { printf("setsockopt failed:%s ", strerror(errno)); return EXIT_FAILURE; } struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(8080); //INADDR_ANY表示这个服务器上的所有Ip地址。一台服务器可以有多个ip地址。将socket绑定到这个机器的所有ip地址上 addr.sin_addr.s_addr = htonl(INADDR_ANY); //将ip地址与server程序绑定 if (bind(st, (struct sockaddr*) & addr, sizeof(addr)) == -1) { printf("bind fail %s ", strerror(errno)); return EXIT_FAILURE; } //server开始监听。 20代表同时有多少个连接过来(20并发) if (listen(st, 20) == -1) { printf("listen fail %s ", strerror(errno)); return EXIT_FAILURE; } char s[1024]; int client_st = 0;//客户端socket socklen_t len = 0;// struct sockaddr_in client_addr;//客户端IP void* p = &client_addr; int i = 0; for (i = 0; i < 50; i++) { memset(&client_addr, 0, sizeof(client_addr)); socklen_t len = sizeof(client_addr); //accept会阻塞,直到有客户端连接过来。accept返回客户端的描述符 client_st = accept(st, (struct sockaddr*) & client_addr, &len); if (client_st == -1) { printf("accept fail %s ", strerror(errno)); return EXIT_FAILURE; } memset(s, 0, sizeof(1024)); ////接受来自客户端的消息 //if (recv(client_st, s, sizeof(s), 0) == -1) //{ // printf("receive fail %s ", strerror(errno)); // close(client_st); // return EXIT_FAILURE; //} //printf("内容:%s ", s); while (1) { memset(s, 0, sizeof(s)); //recv是阻塞调用,如果客户端不关闭,那么服务端就会死等 int rc = recv(client_st, s, sizeof(s), 0); if (rc>0) { printf("receive success %s ", s); } else if (rc == 0)//如果客户端关闭连接,server端接受时,返回0 { printf("receive close "); break; } else { printf("receive fail %s ", strerror(errno)); break; } } close(client_st);//关闭客户端的socket } close(st); getchar(); }