一 模板函数 其实是servfox中的一个部分,拿来用用挺好. tcputils.h #ifndef TCPUTILS_H #define TCPUTILS_H #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #define MAXCONNECT 10 #define SERVEUR_PORT 7070 #define CLIENT_PORT 7071 #define SERVEUR_ADR "127.0.0.1" void exit_fatal(char *messages); int open_sock(int port); int open_clientsock(char * address, int port); int read_sock(int sockhandle, unsigned char* buf, int length); int write_sock(int sockhandle, unsigned char* buf, int length); void close_sock(int sockhandle); int reportip( char *src, char *ip, unsigned short *port); #endif /* TCPUTILS_H*/ tcputils.c #include "tcputils.h" void exit_fatal(char *messages) { printf("%s /n",messages); exit(1); } static void initaddr (struct sockaddr_in *servadrr,char *address,int port); /*************************************************************************/ static void initaddr (struct sockaddr_in *servadrr,char *address,int port) { int adrsize = 0; if(address){ adrsize = strlen(address); if(adrsize < 7 || adrsize > 15) exit_fatal("setting wrong address Abort !!"); servadrr->sin_addr.s_addr = inet_addr(address); } else { servadrr->sin_addr.s_addr = INADDR_ANY; } servadrr->sin_family = AF_INET; servadrr->sin_port = htons (port); memset (&(servadrr->sin_zero), '/0', 8); } int open_sock (int port) { struct sockaddr_in servadr; int server_handle; int O_on = 1; /* Create a new socket */ if ((server_handle = socket (AF_INET, SOCK_STREAM, 0)) == -1) exit_fatal ("Error opening socket Abort !"); if (setsockopt (server_handle, SOL_SOCKET, SO_REUSEADDR, &O_on, sizeof (int)) == -1) exit_fatal ("Setting reused address fail Abort !"); /* Now set the server address struct and bind socket to the port*/ initaddr (&servadr,NULL, port); if (bind (server_handle, (struct sockaddr *) &servadr, sizeof (struct sockaddr)) == -1) exit_fatal ("error bind socket"); /* Listen on the socket */ if (listen (server_handle, MAXCONNECT) == -1) exit_fatal ("Damned errors when listen Abort !"); return server_handle; } int open_clientsock(char * address, int port) { struct sockaddr_in servadr; int client_handle; /* Create a new socket */ if ((client_handle = socket (AF_INET, SOCK_STREAM, 0)) == -1) exit_fatal ("Error opening socket Abort !"); /* Now set the server address struct and connect client socket to the port*/ initaddr (&servadr,address,port); if (connect(client_handle,(struct sockaddr *) &servadr, sizeof (struct sockaddr)) == -1) exit_fatal ("connect failed Abort !"); return client_handle; } void close_sock (int sockhandle) { close (sockhandle); } int write_sock (int sockhandle, unsigned char *buf, int length) { int byte_send = -1; byte_send = write (sockhandle, buf, length); return (length - byte_send); } int read_sock (int sockhandle, unsigned char *buf, int length) { int byte_read = -1; unsigned char *ptbuf =buf; int mlength = length; int i = 0; // printf("begin/n"); do { byte_read = read (sockhandle, ptbuf,mlength); // printf("%d/n",byte_read); if (byte_read > 0){ ptbuf = ptbuf+byte_read; mlength = mlength-byte_read; // printf("reste to read %d /n",mlength); } //printf("buffer value 0x%02X 0x%02X /n",buf[0],buf[1]); i++; // printf("waiting %d /n",i); if(i > 10000) return -1; } while (mlength > 0); return (mlength); } int reportip( char *src, char *ip, unsigned short *port) { int j,k,done,ipdone,nbpt=0; char *AdIpPort= src; char *AdIp = ip; char Ports[] = "65536"; j=0;k=0;done=0;ipdone=0; while(j < 22){ switch (AdIpPort[j]){ case '/0': done =1; break; case '.': nbpt++; if(nbpt > 3){ //printf("error fatal /n"); return -1; } break; case ':': k = 0; ipdone = 1; AdIp[j++] ='/0'; break; default: break; } if (ipdone) Ports[k++]=AdIpPort[j++]; else AdIp[k++]=AdIpPort[j++]; if(done) break; } *port = (unsigned short) atoi (Ports); //printf ("Ip %s Port %s /n",AdIp,Ports); if(*port < 1024) { //printf("ERROR Set default port to 7070 /n"); *port = 7070; } return 0; } 二 例子 client_test.c #include "tcputils.h" #include <stdio.h> int main() { int fdsock=open_clientsock("127.0.0.1",7070); char buf[100]="hello world!"; { if(write_sock(fdsock,buf,strlen(buf))!=0) { printf("error occur/n"); }else { printf("write ok/n"); } } close_sock(fdsock); return 0; } server_test.c #include "tcputils.h" #include <stdio.h> int main() { int listenfd=open_sock(7070); char buf[20]=""; int connfd; int n; while(1) { if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1) { printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } if((n=read_sock(connfd,buf,sizeof(buf)))>0) { printf("error/n"); }else { buf[sizeof(buf)]='/0'; printf("%s/n",buf); } close(connfd); } close_sock(listenfd); return 0; } Makefile TARGET=client_test server_test default:$(TARGET) OBJS_CLIENT=client_test.o tcputils.o OBJS_SERVER=server_test.o tcputils.o client_test:$(OBJS_CLIENT) gcc $^ -o $@ server_test:$(OBJS_SERVER) gcc $^ -o $@ .c.o: gcc -c $< -o $@ clean: rm -rf *.o $(TARGET)