linux下TCP Socket编程C语言小实例
来源:互联网 发布:java windows相对路径 编辑:程序博客网 时间:2024/05/23 16:56
几乎是全部按照这个链接上的网址实现的:http://blog.csdn.net/leo115/article/details/8044795
服务器端的代码:
<span style="font-size:18px;">#include <stdio.h>#include <stdlib.h>#include <strings.h>#include <sys/socket.h>#include <memory.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>//处理sighandler_t没有定义的问题#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int sig, sighandler_t handler);#define PORT 11910 //定义通信的端口号#define BACKLOG 5#define buflen 1024 void process_conn_server(int s); //跟客户端进行通信的处理函数void sig_pipe(int signo); //信号处理函数int ss, sc; int main(int argc, char *argv[]){//客户端和服务器端的地址结构struct sockaddr_in server_addr;struct sockaddr_in client_addr;int err;pid_t pid;ss = socket(AF_INET, SOCK_STREAM, 0); //建立一个套接字,TCPif(ss < 0){printf("server: server socket create error\n");return -1;}//注册信号sighandler_t ret;ret = signal(SIGTSTP, sig_pipe);if(SIG_ERR == ret){printf("signal mount error\n");return -1;}elseprintf("signal mount ok\n");//初始化地址结构memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //设置地址 server_addr.sin_port = htons(PORT); //设置端口号//将套接字和地址绑定err = bind(ss, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));if(err < 0){printf("server : bind error\n");return -1;}//设置监听队列的大小err = listen(ss, BACKLOG);if(err < 0){printf("server : listen error\n");return -1;}for(;;){socklen_t addrlen = sizeof(client_addr);//sc为客户端套接字描述符sc = accept(ss, (struct sockaddr *)&client_addr, &addrlen);if(sc < 0) continue;else printf("server : connected\n");pid = fork();if(pid == 0){ //子进程与客户端进行通信close(ss);process_conn_server(sc);}else close(sc); //客户端继续进行监听}}void process_conn_server(int s){ssize_t size = 0;char buffer[buflen];for(;;){//收到从客户端发来的数据并进行输出for(size = 0; size == 0; size = read(s, buffer, buflen));printf("%s", buffer);if(strcmp(buffer, "quit") == 0){close(s);return;}sprintf(buffer, "%d bytes altogether\n", size);write(s, buffer, strlen(buffer) + 1);}}void sig_pipe(int signo){printf("catch a signal\n");if(signo == SIGTSTP){printf("get SIGTSTP signal");int ret1 = close(ss);int ret2 = close(sc);int ret = ret1 > ret2 ? ret1 : ret2;if(ret == 0) printf("success : close IPC");else if(ret == -1) printf("fail : not close IPC");exit(1);}}</span>
<span style="font-size:18px;">#include <stdio.h>#include <strings.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <stdlib.h>#include <memory.h>#include <arpa/inet.h>#include <netinet/in.h>#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int sig, sighandler_t handler);#define PORT 11910 //端口号#define Buflen 1024void process_conn_client(int s); //客户端进行通信的处理函数void sig_pipe(int signo);int s;int main(int argc, char *argv[]){struct sockaddr_in server_addr; //服务器端的地址结构int err;sighandler_t ret;char server_ip[50] = "";s = socket(AF_INET, SOCK_STREAM, 0); //建立套接字if(s < 0){printf("client : create socket error\n");return 1;}ret = signal(SIGTSTP, sig_pipe);if(SIG_ERR == ret){printf("signal mount fail\n");return -1;}else printf("signal mount success\n");//初始化服务器端的地址结构memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//输入服务器的ip地址printf("please input server ip address: \n");read(0, server_ip, 50);server_addr.sin_addr.s_addr = inet_addr(server_ip);//与服务器端进行连接操作err = connect(s, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));if(err == 0) printf("client : connect to server\n");else{printf("client : connect error\n");return -1;}process_conn_client(s);close(s);}void process_conn_client(int s){ssize_t size = 0;char buffer[Buflen];for(;;){memset(buffer, '\0', Buflen);size = read(0, buffer, Buflen);if(size > 0){write(s, buffer, strlen(buffer) + 1);for(size = 0; size == 0; size = read(s, buffer, Buflen));write(1, buffer, strlen(buffer) + 1);}}}void sig_pipe(int signo){printf("Catch a signal\n");if(signo == SIGTSTP){int ret = close(s);if(ret == 0) printf("success : close IPC\n");else if(ret == -1) printf("fail : not close IPC\n");exit(1);}}</span>
时间有点晚了,要回宿舍,写的比较草,准备明天自己实现一个,客户端输入两个整数,服务器端实现完成两个整数的加法,尝试一下...
0 0
- Linux下TCP Socket编程C语言小实例
- Linux下TCP Socket编程C语言小实例
- linux下TCP Socket编程C语言小实例
- Linux下TCP Socket编程C语言小实例
- linux下C语言 socket tcp编程
- C语言Linux下的Socket 编程(TCP)
- linux下TCP/socket编程实例
- Linux下C语言TCP编程02
- Linux下C语言TCP编程01
- Linux下C语言socket编程
- Linux下C语言socket编程
- Linux下C语言socket网络编程
- Linux下C语言Socket编程
- Linux C Socket编程原理及tcp, udp简单实例
- Linux C Socket TCP编程介绍及实例
- 小田的专栏 Linux C socket 编程之TCP
- Linux C语言Socket编程例子(TCP和UDP)
- linux下C语言多线程编程实例
- RecylerView基本用法
- 一道面试题的反思
- 虚方法
- 用srvany.exe将程序安装为windows服务的步骤链接
- JSON 之 jackson 用法
- linux下TCP Socket编程C语言小实例
- zzu数学 实验三最佳分数近似国歌
- linux内核数据结构-顺序存储链表(1)
- 文件缓存回写简述
- 什么是rawType
- Java Web 之CSS
- 设计模式宏观把控(一)
- JavaEE笔记(四)Struts2中的ValueStack 与 ActionContext
- android MVC,MVP,MVVM