实验一 TCP数据发送与接收

【实验目的】

1、熟练掌握套接字函数的使用方法。

2、应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互。

【实验学时】

4学时

【实验内容】

实现一个服务器与一个客户之间通讯。具体功能如下:

(1)服务器端:

服务器端等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号;

循环接收客户发来的信息并在终端上显示,同时在信息前加入序号并返回给客户端;当从客户接收到bye后不再发送给各户并退出程序。

(2)客户端:

根据用户从终端输入的服务器IP地址及端口号连接到相应的服务器;

连接成功后,循环从终端输入信息,并将信息发送给服务器,再从服务器接收信息,并显示在终端上。

当从终端输入bye并发送给服务器后,程序退出。

程序实现:

服务器端:

  1. /* TcpServer.c
  2. copyright@msxh 2015/09/21
  3. */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <stdlib.h>
  9.  
  10. int main(){
  11.  
  12. struct sockaddr_in server;
  13. struct sockaddr_in client;
  14. int listenfd,connetfd;
  15. char ip[];
  16. int port;
  17. int addrlen;
  18. char rebuf[];
  19. char wrbuf[];
  20. char tmp[];
  21. int revlen;
  22. /*---------------------socket-------------------*/
  23. if((listenfd = socket(AF_INET,SOCK_STREAM,))== -){
  24. perror("socket() error\n");
  25. exit();
  26. }
  27.  
  28. /*----------------------IO-----------------------*/
  29. printf("Please input the ip:\n");
  30. scanf("%s",ip);
  31. printf("Please input the port:\n");
  32. scanf("%d",&port);
  33.  
  34. /*---------------------bind----------------------*/
  35. bzero(&server,sizeof(server));
  36. server.sin_family = AF_INET;
  37. server.sin_port = htons(port);
  38. server.sin_addr.s_addr = inet_addr(ip);
  39. if(bind(listenfd,(struct sockaddr *)&server,sizeof(server))== -){
  40. perror("bind() error\n");
  41. exit();
  42. }
  43.  
  44. /*----------------------listen-------------------*/
  45. if (listen(listenfd,)== -){
  46. perror("listen() error\n");
  47. exit();
  48. }
  49.  
  50. /*----------------------accept------------------*/
  51. addrlen = sizeof(client);
  52. if((connetfd = accept(listenfd,(struct sockaddr *)&client,&addrlen))== -){
  53. perror("accept() error\n");
  54. exit();
  55. }
  56. /*---------------------show client---------------*/
  57. printf("connect successful!\n");
  58. printf("the client ip is %s,port is %d\n",inet_ntoa(client.sin_addr),ntohs(port));
  59.  
  60. /*----------------------read and write----------*/
  61. int serial = ;
  62. while(){
  63. bzero(rebuf,sizeof(rebuf));
  64. revlen = read(connetfd,rebuf,sizeof(rebuf));
  65. if((memcmp("bye",rebuf,))== ){
  66. printf("Bye-bye then close the connect...\n");
  67. break;
  68. }
  69. bzero(wrbuf,sizeof(wrbuf));
  70. bzero(tmp,sizeof(tmp));
  71. sprintf(tmp,"%d",serial);
  72. strcat(tmp,rebuf);
  73. bcopy(tmp,wrbuf,strlen(tmp));
  74. write(connetfd,wrbuf,sizeof(wrbuf));
  75. rebuf[revlen] = '\0';
  76. printf("the info from client is:%s\n",rebuf);
  77. serial++;
  78. }
  79.  
  80. /*----------------------close-------------------*/
  81. close(connetfd);
  82. close(listenfd);
  83.  
  84. return ;
  85. }

客户端实现:

  1. /* TcpClient.c
  2. copyright@msxh 2015/09/21
  3. */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <stdlib.h>
  9.  
  10. int main(){
  11. int sockfd;
  12. char wrbuf[];
  13. char ip[];
  14. int port;
  15. int revlen;
  16. char rebuf[];
  17. struct sockaddr_in server;
  18.  
  19. /*---------------------socket---------------------*/
  20. if((sockfd = socket(AF_INET,SOCK_STREAM,))== -){
  21. perror("socket error\n");
  22. exit();
  23. }
  24.  
  25. /*---------------------connect--------------------*/
  26. printf("Please input the ip:\n");
  27. scanf("%s",ip);
  28. printf("Please input the port:\n");
  29. scanf("%d",&port);
  30. bzero(&server,sizeof(server));
  31. server.sin_family = AF_INET;
  32. server.sin_port = htons(port);
  33. inet_aton(ip,&server.sin_addr);
  34. if(connect(sockfd,(struct sockaddr *)&server,sizeof(server))== -){
  35. perror("connect() error\n");
  36. exit();
  37. }
  38.  
  39. /*-----------------------read and write------------------*/
  40. while(){
  41. bzero(wrbuf,sizeof(wrbuf));
  42. bzero(rebuf,sizeof(rebuf));
  43. printf("Please input the info:\n");
  44. scanf("%s",wrbuf);
  45. if((memcmp("bye",wrbuf,))== ){
  46. write(sockfd,wrbuf,strlen(wrbuf));
  47. printf("Bye-bye then close the connect...\n");
  48. break;
  49. }
  50. //printf("%s\n",wrbuf);
  51. write(sockfd,wrbuf,strlen(wrbuf));
  52. revlen = read(sockfd,rebuf,sizeof(rebuf));
  53. rebuf[revlen] = '\0';
  54. printf("The info from server is: %s\n",rebuf);
  55. }
  56. /*------------------------close--------------------------*/
  57. close(sockfd);
  58.  
  59. return ;
  60. }

makefile文件:

  1. main:tcpserver.c tcpclient.c
  2. gcc -o tcpserver tcpserver.c
  3. gcc -o tcpclient tcpclient.c

学习Linux、Unix网络编程时写的第一个程序。。。

【Linux/unix网络编程】之使用socket进行TCP编程的更多相关文章

  1. 【Socket编程】通过Socket实现TCP编程

    通过Socket实现TCP编程 Socket通信 : 1.TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 2.基于TCP协议实现网络通信的类: 客户端----Socket类 服务器 ...

  2. 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)

    RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...

  3. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

  4. linux/unix网络编程之 select

    转自http://www.cnblogs.com/zhuwbox/p/4221934.html linux 下的 select 知识点 unp 的第六章已经描述的很清楚,我们这里简单的说下 selec ...

  5. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  6. python网络-Socket之TCP编程(26)

    一.TCP简介 1.TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TC ...

  7. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  8. JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

  9. 【Socket编程】通过Socket实现UDP编程

    通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...

随机推荐

  1. notepad正则表达式

    文件名称匹配 文件名称: boost_chrono-vc100-mt-1_49.dll 对应的notepad正则表达式: \w*_\w*-\w*-\w*-\w*-\w*.dll 移除空行 查找目标: ...

  2. .html和.htm的区别

    很多人会认为网页扩展名html和htm是等同的,但事实上他们还是有区别的. 包含HTML内容的文件最常用的扩展名是.html,但是像DOS这样的旧操作系统限制扩展名为最多3个字符,所以.htm扩展名也 ...

  3. 面向侧面的程序设计AOP-------《二》本质

    本文转载自张逸:晴窗笔记 AOP技术本质 2.2.1 技术概览 AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Prog ...

  4. HDU4870 Rating(概率)

    第一场多校,感觉自己都跳去看坑自己的题目里去了,很多自己可能会比较擅长一点的题目没看,然后写一下其中一道概率题的题解吧,感觉和自己前几天做的概率dp的思路是一样的.下面先来看题意:一个人有两个TC的账 ...

  5. 【动态规划】The Triangle

    问题 E: [动态规划]The Triangle 时间限制: 1 Sec  内存限制: 128 MB提交: 24  解决: 24[提交][状态][讨论版] 题目描述 73 88 1 02 7 4 44 ...

  6. sublime text3侧边栏主题不生效问题解决

    sublime text3主题插件: Seti_UI 插件安装: 在线安装:需要FQ window: ctrl+shift+p 找install package:之后搜索 Seti_UI 安装完成后需 ...

  7. KVM中Linux虚拟机的硬盘添加方法

    [root@cache01 ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_roo ...

  8. js伪数组及转换

    什么是伪数组 能通过Array.prototype.slice转换为真正的数组的带有length属性的对象. 这种对象有很多,比较特别的是arguments对象,还有像调用getElementsByT ...

  9. ***微信LBS地理位置开发+百度地图API(地理位置和坐标转换)

    微信公众平台开发 - 获取用户地理位置 本文介绍在微信公众平台上如何使用高级接口开发获取用户地理位置的功能. 一.获取用户地理位置接口 开通了上报地理位置接口的公众号,用户在关注后进入公众号会话时,会 ...

  10. 在MVC3或asp.net中修改KindEditor实现上传图片时添加水印

    主要修改两个文件:image.js和upload_json.ashx文件. 一.修改image.js文件 打开kindeditor/plugins/image目录下的image.js文件,找到 '&l ...