Linux服务器监听程序 一个简单的服务器监听程序模型,旨在演示相关函数的用法,Linux3.13下编译通过。 #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #include <errno.h> /*TCP接口信息*/ struct tcp_info { short sCommType; /*类型:0 TCP*/ unsigned long ulIPAddr; /*相关类型的IP*/ unsigned short usPort; /*相关类型的端口*/ }; /*服务端TCP信息*/ typedef struct tcp_info server_info; /*客户端TCP信息*/ typedef struct tcp_info client_info; /*解析客户端IP用*/ typedef union __endian_long_tag { struct { unsigned char A; unsigned char B; unsigned char C; unsigned char D; }Byte; unsigned long Dword; } DWORDENDIAN; #define SERVER_IP "192.168.1.103" //服务器IP #define SERVER_PORT "1235" //端口号,自行定义 int CreateTCP(server_info *server) { struct sockaddr_in sin; int iLen; int iConnID; iLen = (int)(sizeof(struct sockaddr_in)); memset(&sin, 0, iLen); if (server->sCommType != 0) { printf("Not TCP type!\n"); return -1; } iConnID = socket(PF_INET, SOCK_STREAM, 0); if (iConnID < 0) { printf("TCP:Create socket error:[%s]!\n", (char*)strerror(errno));\ return -1; } const int REBINDON = 1; setsockopt(iConnID, SOL_SOCKET, SO_REUSEADDR, &REBINDON,sizeof(REBINDON)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = (unsigned long)(server->ulIPAddr); sin.sin_port = htons(server->usPort); if (bind(iConnID, (const struct sockaddr *)&sin, iLen) < 0) { printf("TCP:Bind Server IP or port error:[%s]!\n", (char*)strerror(errno)); return -1; } if (listen(iConnID, 5) < 0) { printf("TCP:Listen Server socket error:[%s]!\n", (char *)strerror(errno)); return -1; } return iConnID; } int main(void) { int iFd; int iClifd; server_info server; client_info client; memset(&server, 0, sizeof(server_info)); memset(&client, 0, sizeof(client_info)); server.sCommType = 0; server.ulIPAddr = inet_addr(SERVER_IP); server.usPort = atoi(SERVER_PORT); printf("father_pid=[%d]\n", getpid()); iFd = CreateTCP(&server); if (iFd < 0) { printf("CreateTCPerror!\n"); return 1; } client.sCommType = 0; sleep(3); while(1) { struct sockaddr_in sin; int iLen; iLen = (int)(sizeof(struct sockaddr_in)); memset(&sin, 0, iLen); iClifd = accept(iFd, (struct sockaddr *)&sin, &iLen); if (iClifd < 0) continue; if (fork() == 0) { DWORDENDIAN nIps; char clientsource[15]; memset(clientsource, 0, sizeof(clientsource)); iFd = -1; nIps.Dword = sin.sin_addr.s_addr; printf("child_pid=[%d]\n", getpid()); sprintf(clientsource, "%3.3d%3.3d%3.3d%3.3d", nIps.Byte.A,nIps.Byte.B, nIps.Byte.C, nIps.Byte.D); printf("clientsource=[%s]\n", clientsource); } } } 文件保存为server.c,执行”gccserver.c”,执行./a.out后,使用TCP助手连接,每次连接打印客户端IP。
|