系统编程之网络编程(TCP客户端与服务器的搭建)
2017-08-16 17:57
633 查看
TCP是重要的传输层协议,是一种有连接的、可靠的传输。传输数据前要先建立连接,如果传输错误或者数据丢失,就会重传。因此使用TCP,开销大,速度慢。
UDP也是传输层协议,它是无连接的、不可靠的传输服务。不必要在数据传输之前建立会话,但可能造成数据的丢失。系统只保证尽力发送。优点是传输速度快、开销小。视频点播使用的就是UDP。
下面是我实现的TCP客户端与服务器的搭建:
服务器:
客户端:
运行结果:
本程序还只能实现一个客户端的连接,想要实现多个客户端连接,就要用到多线程编程。
UDP也是传输层协议,它是无连接的、不可靠的传输服务。不必要在数据传输之前建立会话,但可能造成数据的丢失。系统只保证尽力发送。优点是传输速度快、开销小。视频点播使用的就是UDP。
下面是我实现的TCP客户端与服务器的搭建:
服务器:
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #define PORT 9999 //端口号 //服务器的搭建 int main() { //创建一个套接字 int listen_socket = socket(AF_INET,SOCK_STREAM, 0); if (listen_socket == -1) { perror("socket"); return -1; } //命名套接字,绑定本地的ip地址和端口 struct sockaddr_in addr; memset(&addr,0,sizeof(addr)); //清空 addr.sin_family = AF_INET; //设置地址族 addr.sin_port = htons(PORT); //设置端口 addr.sin_addr.s_addr = htonl(INADDR_ANY); //使用本地任意IP地址 int ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof(addr)); //绑定 if (ret == -1) { perror("bind"); return -1; } //监听本地套接字 if(listen(listen_socket, 5) == -1) { perror("listen"); return -1; } while(1) { printf ("等待客户端连接.......\n"); //接收连接 // 监听套接字不能用来与客户端进行通信,它的职责是监听客户端的连接 // accpet 处理客户端的连接,如果成功接收,会返回一个新的套接字,用来与客户端进行通信 // accept的第三个参数 是一个传入传出参数 struct sockaddr_in client_addr; // 用来保存客户端的ip和端口信息 int len = sizeof(client_addr); int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &len); //连接,返回新的套接字,用于和客户端通信 if (client_socket == -1) { perror("accept"); return -1; } printf ("成功接收一个客户端: %s\n", inet_ntoa(client_addr.sin_addr)); char buf[1024]; while (1) { int ret = read (client_socket, buf, 1023); if(ret == 0) { printf("client is close!\n"); break; } buf[ret] = '\0'; printf ("%s\n", buf); write (client_socket, buf, 1023); } close(client_socket); //关闭客户端通信套接字 } close(listen_socket); //关闭监听套接字 return 0; }
客户端:
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> //客户端的搭建 int main(int argc,char *argv[]) { if(argc!=3) { fprintf(stderr,"Usage:%s hostname \a\n",argv[0]); exit(1); } //创建一个套接字 int server_socket = socket(AF_INET,SOCK_STREAM, 0); if (server_socket == -1) { perror("socket"); return -1; } //设置IP地址和端口 struct sockaddr_in addr; memset(&addr,0,sizeof(addr)); addr.sin_family = AF_INET; //设置地址族 addr.sin_port = htons((unsigned short)atoi(argv[2])); //设置端口 addr.sin_addr.s_addr = inet_addr(argv[1]); //设置IP地址 //连接服务器 int ret = connect(server_socket, (struct sockaddr *)&addr,sizeof(struct sockaddr)); if (ret == -1) { perror("bind"); return -1; } printf ("连接到服务器:%s\n",argv[1]); char buf[1024]; while (1) { printf("input:"); scanf ("%s",buf); write (server_socket,buf, 1023); int ret = read (server_socket, buf, 1023); buf[ret] = '\0'; printf ("receive = %s\n", buf); } close(server_socket); //关闭套接字 return 0; }
运行结果:
本程序还只能实现一个客户端的连接,想要实现多个客户端连接,就要用到多线程编程。
相关文章推荐
- Python网络编程 3.1 由简单的TCP服务器、客户端程序分析相关方法
- Python网络编程 3.2 可能出现死锁的tcp服务器、客户端
- Python网络编程之socket编程(一)--使用TCP和UDP客户端和服务器通信
- 网络编程(6)—— 基于Windws系统的UDP协议socket服务器和客户端
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- linux c之网络编程之TCP(服务器和和客户端基础通信)
- 【Linux网络编程】基于TCP多进程(fork)版本客户端/服务器
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- 深入理解计算机系统中网络编程一节echo客户端服务器的源码编译和运行
- 网络编程(5)—— 基于Linux系统的UDP协议socket服务器和客户端
- 【网络编程笔记】简单的TCP协议 socket编程(C语言版服务器和客户端)
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- 网络编程基础(1)----------TCP客户端与服务器
- [网络编程]_[初级]_[Windows网络编程之搭建服务器和客户端]
- Linux网络编程 之 TCP 多线程的服务器和客户端同时收发数据
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- Java基础知识强化之网络编程笔记07:TCP之服务器给客户端一个反馈案例
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- 网络编程资料总结(二)----Tcp多线程服务器和客户端的实现