linux下socket实现TCP通信的简单程序接口封装

帮朋友写的一个linux通信程序的简单接口。。

删了怪可惜的,发上来好了~~

 

程序提供TCP连接的消息发送

1:
server.c server.h为服务器端程序。
    程序执行后,已共享方式绑定到主机端口8888,等待客户机连接,当有客户连接时,发送"connect ok"到客户机,
然后关闭此客户连接,继续等待下一用户。
    去掉主程序文件server.c中main函数和错误处理函数,此程序可当作封包使用,提供网络主机设置,绑定,等待连接,发送消息等功能。

详见注释;


2:
client.c为客户机程序
详见注释;

 

server.h

 

/************************************* programme name: cui bo E-mail: [email protected] date: 20090716 NET-TCP pack **************************************/ #ifndef _SERVER_H_ #define _SERVER_H_ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <time.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #define USER_NUMBER 10 //最大连接数 extern int SERV_PORT;//管理员端口 /*错误处理*/ int ServerSysError(char *str); int ServerUserError(char *str); void NotNetLink(int signo);//网络断开或异常信号捕捉 /* 建立服务器端socket接口,绑定套接字到本机地址,返回可用套接字 int SERV_PORT - 监听端口号 正确返回可用的套接口,错误返回-1 绑定放是:共享方式 采用协议:Internet网络地址(IPV4),稳定可靠的连接,双向通信方式(TCP协议) */ int SetSocket(int SERV_PORT); /* 允许客户机连接到sockfd,最多可以接受USER_NUMBER个客户机连接(在线) int sockfd - 可用的套接口地址 正确返回0,否则返回-1 */ int LanuchServer(int *sockfd); /* 向客户端发送信息 const char* msg - 要发送的消息 int client_fd - 发送到指定客户机地址 错误返回-1,正确返回发送字节数 */ int SendMsg(const char* msg, int client_fd); #endif

 

 

 server.c

 

 #include "server.h" int SERV_PORT = 8888;//端口号 int main(void) { int sockfd; int clientfd; int sin_size; int i; /*客户地址信息*/ struct sockaddr_in mote_addr; /*创建套接字、监听端口,绑定到本机,等待管理员,开始服务*/ sockfd = SetSocket(SERV_PORT); if(sockfd == -1) ServerSysError("Socket Create failed or Bind Error!/n"); LanuchServer(&sockfd); if(sockfd == -1) ServerSysError("Listen Error!/n"); /*捕捉网络断开发送异常等*/ signal(SIGPIPE, NotNetLink); /*循环等待客户连接*/ while(1) { fprintf(stdout, "%s/n", "wait client...."); fflush(stdout); /*阻塞等待连接到达*/ sin_size = sizeof(struct sockaddr_in); if((clientfd = accept(sockfd, (struct sockaddr*)&mote_addr, &sin_size)) == -1) { ServerUserError("a user Accept error."); continue; } sleep(1); /*显示客户信息*/ fprintf(stdout, "Received a connection from %s/n", inet_ntoa(mote_addr.sin_addr)); fflush(stdout); /*发送确认信息到客户*/ if(SendMsg("connect ok", clientfd) == -1) { ServerUserError("Send Msg to client Error!/n"); close(clientfd); continue; } close(clientfd);//关闭连接 } close(sockfd);//关闭端口的监听 return 0; } /*错误处理*/ int ServerSysError(char *str) { fprintf(stdout, "server-erro@servertime-%ld:%s /n", time(NULL), str); fflush(stdout); exit(1); } int ServerUserError(char *str) { fprintf(stdout, "server-user@servertime-%ld:%s /n", time(NULL), str); fflush(stdout); return 0; } void NotNetLink(int signo)//信号处理 { fprintf(stdout, "server-signo@servertime-%ld: :Signal is %d /n", time(NULL), signo); fflush(stdout); signal(signo, NotNetLink); } /* 建立服务器端socket接口,绑定套接字到本机地址,返回可用套接字 int SERV_PORT - 监听端口号 正确返回可用的套接口,错误返回-1 绑定放是:共享方式 采用协议:Internet网络地址(IPV4),稳定可靠的连接,双向通信方式(TCP协议) */ int SetSocket(int SERV_PORT) { int sockfd; int opt; struct sockaddr_in servaddr; if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { return -1; } bzero(&servaddr, sizeof(servaddr));//置地址&servaddr的前sizeof(servaddr)个字节为零 opt = SO_REUSEADDR; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));//同一套接口可被多个程序绑定 servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) { close(sockfd); return -1; } return sockfd; } /* 允许客户机连接到sockfd,最多可以接受USER_NUMBER个客户机连接(在线) int sockfd - 可用的套接口地址 正确返回0,否则返回-1 */ int LanuchServer(int *sockfd) { if(listen(*sockfd, USER_NUMBER) == -1) { return -1; } fflush(stdout); return 0; } /* 向客户端发送信息 const char* msg - 要发送的消息 int client_fd - 发送到指定客户机地址 错误返回-1,正确返回发送字节数 */ int SendMsg(const char* msg, int client_fd) { int len; if((len = send(client_fd, msg, strlen(msg), 0)) == -1) { return -1; } return len; }

 

 

 

 client.c

 

#include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <arpa/inet.h> #include <time.h> #include <unistd.h> //#define PORT 8888 /*错误处理*/ void syserror(char *p); int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; char tcom[100]; int i,len; char *charp; /*要求参数*/ if(argc!=3){syserror("myc <IPaddress> <prot>");} /*建立套接字,帮定到主机*/ sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr,sizeof(servaddr)); /*设置套接字*/ servaddr.sin_family=AF_INET; charp = argv[2]; for(i=0; *charp; charp++) { i += *charp - '0'; i *= 10; } i /= 10; servaddr.sin_port=htons(i); inet_pton(AF_INET, argv[1], &servaddr.sin_addr); /*连接到服务器*/ connect(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr)); /*阻塞方式读服务器反馈并处理*/ if((len = recv(sockfd, tcom, 99, 0)) == -1) { syserror("link server error."); } tcom[len]='/0'; if(strcmp(tcom, "connect ok")) { puts(tcom); syserror("link server exception."); } printf("link state:%s/n", tcom); return 0; } void syserror(char *p) { puts(p); exit(1); }

 

 

 

你可能感兴趣的:(linux,tcp,server,socket,struct,服务器)