linux下socket实现TCP通信的简单程序接口封装
2009-07-22 09:12
971 查看
帮朋友写的一个linux通信程序的简单接口。。
删了怪可惜的,发上来好了~~
程序提供TCP连接的消息发送
1:
server.c server.h为服务器端程序。
程序执行后,已共享方式绑定到主机端口8888,等待客户机连接,当有客户连接时,发送"connect ok"到客户机,
然后关闭此客户连接,继续等待下一用户。
去掉主程序文件server.c中main函数和错误处理函数,此程序可当作封包使用,提供网络主机设置,绑定,等待连接,发送消息等功能。
详见注释;
2:
client.c为客户机程序
详见注释;
server.h
server.c
client.c
删了怪可惜的,发上来好了~~
程序提供TCP连接的消息发送
1:
server.c server.h为服务器端程序。
程序执行后,已共享方式绑定到主机端口8888,等待客户机连接,当有客户连接时,发送"connect ok"到客户机,
然后关闭此客户连接,继续等待下一用户。
去掉主程序文件server.c中main函数和错误处理函数,此程序可当作封包使用,提供网络主机设置,绑定,等待连接,发送消息等功能。
详见注释;
2:
client.c为客户机程序
详见注释;
server.h
/************************************* programme name: cui bo E-mail: freecunix@gmail.com 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 C TCP Socket实现客户与服务器简单通信
- linux下基于TCP简单的socket通信程序
- Linux C TCP Socket实现客户与服务器简单通信
- Linux Socket 事件触发模型 epoll 示例 这里会写一个用C语言的TCP服务器的完全实现的简单程序
- 基于socket通信的,利用MFC实现TCP通信的C/S架构程序
- JAVA系列课程讲座一:使用Socket通信实现网络通信程序(TCP方式)
- linux下第一个socket编程实现的局域网内通信(基于TCP)
- java用socket和serversocket实现一对一聊天(java实现简单的TCP聊天程序)
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
- Java 基于TCP/IP 实现简单的 socket 通信
- JAVA系列课程讲座二:使用Socket通信实现简单聊天通信程序(UDP方式)
- linux下一个简单的TCP通信程序——客户端向服务端发送任意字符串
- 【tcp-ip学习总结】使用tcp协议实现简单的通信小程序
- C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- Linux下两个程序进行socket通信的简单例子
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
- Linux下两个程序进行socket通信的简单例子
- C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- TCP本地通信 简单程序实现 (一)
- 简单的IPv6 UDP/TCP socket编程 -- 两台Linux实现简单的ipv6通信