server端 #include <iostream> using namespace std; #include <arpa/inet.h> #include <sys/socket.h>//套接信息需要的头文件 #include <netinet/in.h> #include <unistd.h> #include <fcntl.h> #include <string.h>//用信号回收进程 #include <stdlib.h>//标准库头文件 #include <sys/wait.h>//waitpid需要的头文件 void func(int sig) { signal(sig, func); while(waitpid(-1, NULL, WNOHANG)>0) continue; } void gameover(const char* msg){ cout << "error" << msg << endl; exit(-1); } int main(int argc,char* argv[]){ signal(SIGCHLD, func); if(argc!=2){ cout << *argv << " port" << endl; return 0; } short port = atoi(argv[1]); sockaddr_in si;//套接信息(结构变量) si.sin_family = AF_INET;//IPv4 si.sin_port = htons(port);//转成网络字节顺序 si.sin_addr.s_addr = htonl(INADDR_ANY);//或写成0,本机全部ip地址0.0.0.0转换后也是0 socklen_t len = sizeof(si);//套接信息长度 int fs = socket(AF_INET, SOCK_STREAM, 0);//创建套接字(整数变量) if(fs<0) gameover("socket");//如果创建套接信息失败,调用gameover if(bind(fs,(sockaddr*)&si, len)<0)//只要用到套接信息就要用到类型转换 gameover("bind");//如果套接绑定出错,调用gameover if(listen(fs,20)<0)//被动套接口如果失败就调用gameover gameover("listen"); while(1){ sockaddr_in c; len = sizeof(c); int fc = accept(fs,(sockaddr*)&c, &len);//等待对方的套接信息 if(fc<0) continue;//如果没有收到对方的套接信息再等待下一个 if(fork()!=0){//如果是父进程就关闭,并且继续等待下一个 close(fc); continue; } close(fs); char msg[1000] = "YOUR IP:"; char ip[100]; inet_ntop(AF_INET, &c.sin_addr, ip, 100);//点分地址转换 cout << ip << "到此一游" << endl;//显示一下等录的ip strcat(msg, ip);//把ip地址字符串追加在后面 strcat(msg, "/n"); write(fc, msg, strlen(msg)); for(;;){//读写,并显示谁发了什么内容 int n = read(fc, msg, 900); if(n<=0) break; if(msg[n-1]=='/n') n--;//如果最后是换行符就不读取 msg[n] = '/0'; cout << ip << ':' << msg << endl; write(fc, msg, strlen(msg)); write(fc, "/n", 1); if(msg[0]=='q') break;//如果输入q就退出循环 } close(fc); exit(0);//子进程该终结的地方加入exit(0) } } client端 #include <iostream> using namespace std; #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <signal.h> #include <stdlib.h> #include <sys/wait.h> void gameover(const char* msg){ cout << "error" << msg << endl; } int main(int argc,char* argv[]){ if(argc!=3){ cout << *argv << " ip port" << endl; return 0; } short port = atoi(argv[2]); sockaddr_in si; si.sin_family = AF_INET; si.sin_port = htons(port); inet_pton(AF_INET, argv[1], &si.sin_addr); socklen_t len = sizeof(si); int fs = socket(AF_INET, SOCK_STREAM, 0); if(fs<0) gameover("socket"); if(connect(fs, (sockaddr*)&si, len)<0) gameover("connect"); char msg[1000] = "YOUR IP:"; char ip[100]; int n = read(fs, msg, strlen(msg)); msg[n] = '/0'; cout << msg << flush; while(1){ cout << "input:"; cin.getline(msg, 900); strcat(msg, "/n"); write(fs, msg, strlen(msg)); int n = read(fs, msg, 1000); if(n<=0) break; if(msg[n-1]=='/n') n--; msg[n] = '/0'; cout << msg << endl; if(msg[0]=='q') break; } close(fs); } 服务端: 1、socket 2、bind 3、listen 4、accpet 5、收发 客户端: 1、socket 2、connect 3、收发