linux下TCP编程示例(服务端/客户端)
2015-12-20 20:53
633 查看
1. 前言
1.1 TCP编程模型(服务端/客户端)
1.2 编程步骤
(1)服务端:①创建套接字
②绑定本地地址和端口号
③侦听客户端的连接请求
④接受客户端的连接请求
⑤接收客户端发来的消息
⑥发送消息给客户端
⑦关闭套接字
(2)客户端
①创建套接字
②连接服务器
③发送消息给服务器
④接收服务器的回应
⑤关闭套接字
2. 服务端示例程序
2.1 单服务器
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #define PORT 10000 int main(){ //1.创建套接字 int sid = socket(AF_INET,SOCK_STREAM,0); if(sid < 0 ){ perror("socket"); exit(-1); } struct sockaddr_in saddr,caddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(PORT); saddr.sin_addr.s_addr = INADDR_ANY; //2.绑定本地地址和端口号 int iRet = bind(sid,(struct sockaddr*)&saddr,sizeof(saddr)); if(iRet != 0){ perror("bind"); exit(-1); } //3.侦听客户端的连接 iRet = listen(sid,5); if(iRet != 0){ perror("listen"); exit(-1); } //4.接受客户端的连接 int addrsize = sizeof(struct sockaddr_in); int pid = accept(sid,(struct sockaddr *)&caddr,&addrsize); if(pid < 0){ perror("accept"); exit(-1); } char buffer[1024] = {0}; int len = -1; while(1){ bzero(buffer,sizeof(buffer)); //5.接收客户端发送的消息 len = recv(pid,buffer,sizeof(buffer),0); if(len < 0) { perror("recv"); exit(-1); } else { buffer[len] = 0;//加结束符 printf("Receive: %s\n",buffer); } bzero(buffer,sizeof(buffer)); strcpy(buffer, "Welcome to access the server!"); //6.发送消息给客户端 len = send(pid,buffer,strlen(buffer),0); if(len < 0){ perror("send"); exit(-1); } } close(pid); close(sid); return 0; }
2.2 基于多线程的并发服务器示例程序(编译:gcc server.c -o server lpthread)
#include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<stdio.h> #include<string.h> #include<unistd.h> #include<pthread.h> #include<stdlib.h> #define PORT 10000 void thread_process(const int * socketid) { int cid = *socketid; char buffer[1024] = {0}; int iLen = -1; while(1) { bzero(buffer,sizeof(buffer)); //5.接收客户端发来的消息 iLen = recv(cid,buffer,sizeof(buffer),0); if(iLen < 0) { perror("recv"); exit(-1); } else { buffer[iLen] = 0;//加结束符 printf("Receive: %s\n",buffer); } bzero(buffer,sizeof(buffer)); strcpy(buffer, "Welcome to access the server!"); //6.发送消息给客户端 iLen = send(cid,buffer,strlen(buffer),0); if(iLen < 0) { perror("send"); exit(-1); } } close(cid); } int main() { //1.创建套接字 int sid = socket(AF_INET,SOCK_STREAM,0); if(sid < 0 ){ perror("socket"); exit(-1); } struct sockaddr_in saddr,caddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(PORT); saddr.sin_addr.s_addr = INADDR_ANY; //2.绑定本地地址和端口号 int iRet = bind(sid,(struct sockaddr*)&saddr,sizeof(saddr)); if(iRet != 0){ perror("bind"); exit(-1); } //3.侦听客户端的连接 iRet = listen(sid,5); if(iRet != 0){ perror("listen"); exit(-1); } while(1) { //4.接受客户端的连接 int addrsize = sizeof(struct sockaddr_in); int cid = accept(sid,(struct sockaddr *)&caddr,&addrsize); if(cid < 0) { perror("accept"); exit(-1); } //创建线程 pthread_t tid; int err = pthread_create(&tid,NULL,(void*)thread_process,(void*)&cid); if (err != 0) { printf("can't create thread: %s\n", strerror(err)); exit(-1); } } //7.关闭套接字 close(sid); }
3. 客户端示例程序
#include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 10000 #define IP "192.168.1.101" int main(){ //1.创建套接字 int cid = socket(AF_INET,SOCK_STREAM,0); if(cid < 0 ){ perror("socket"); exit(-1); } struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(PORT); saddr.sin_addr.s_addr = inet_addr(IP); //2.连接服务器 int iRet = connect(cid,(struct sockaddr*)&saddr,sizeof(struct sockaddr)); if(iRet < 0 ){ perror("connect"); exit(-1); } char buffer[100] = {0}; int len = -1; while(strncmp(buffer,"quit",4) != 0){ bzero(buffer,sizeof(buffer)); fgets(buffer,1024,stdin); //3.发送消息给服务器 len = send(cid,buffer,strlen(buffer),0); if(len < 0) { perror("send"); exit(-1); } bzero(buffer,sizeof(buffer)); //4.接收服务器的回应 len = recv(cid,buffer,sizeof(buffer),0); if(len < 0) { perror("recv"); exit(-1); } else { buffer[len] = 0;//加结束符 printf("\nReceive: %s\n",buffer); } } //5.关闭套接字 close(cid); }
相关文章推荐
- Python之最简单的http的echo 服务
- 卷积神经网络 资料
- poj 3281 网络流最大流量
- cocos2d-x3.0 实现HTTP请求GET、POST
- Linux网络编程笔记
- android网络编程之HttpUrlConnection的讲解--实现文件断点下载
- 第3章 TCP/IP Socket网络通讯------第4章 实现Socket C/S应用程序
- 记一次大量 TCP 连接失败
- 神经网络入门(二)为什么我的算法跑得这么慢?
- http://www.phplo.com/special/2013/0616/467.html
- 利用CocoaHTTPServer实现wifi局域网传输文件到iphone
- 利用CocoaHTTPServer实现wifi局域网传输文件到iphone
- 网络协议都有哪些
- 一种可能的新的人脑信息网络模型
- Unity如何判断网络连接类型
- HTTP协议之:报文详解
- IOS网络开发NSURLSession详解(一)概述
- acl3.1.4 跨平台网络通信与服务器编程框架发布了
- 对OkHttp进行封装,实现了只查询缓存,网络请求失败自动查询本地缓存等功能
- 自己动手写神经网络,自己真的能够动手写神经网络嘛?