客戶端
#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\n", 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\n", 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\n", 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\n", strerror(errno)); return EXIT_FAILURE; } //server開始監聽。 20代表同時有多少個連接過來(20並發) if (listen(st, 20) == -1) { printf("listen fail %s\n", 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\n", strerror(errno)); return EXIT_FAILURE; } memset(s, 0, sizeof(1024)); ////接受來自客戶端的消息 //if (recv(client_st, s, sizeof(s), 0) == -1) //{ // printf("receive fail %s\n", strerror(errno)); // close(client_st); // return EXIT_FAILURE; //} //printf("內容:%s\n", 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\n", s); } else if (rc == 0)//如果客戶端關閉連接,server端接受時,返回0 { printf("receive close\n"); break; } else { printf("receive fail %s\n", strerror(errno)); break; } } close(client_st);//關閉客戶端的socket } close(st); getchar(); }