实验一 TCP数据发送与接收

【实验目的】

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

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

【实验学时】

4学时

【实验内容】

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

(1)服务器端:

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

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

(2)客户端:

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

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

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

程序实现:

服务器端:

 /*     TcpServer.c
copyright@msxh 2015/09/21
*/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h> int main(){ struct sockaddr_in server;
struct sockaddr_in client;
int listenfd,connetfd;
char ip[];
int port;
int addrlen;
char rebuf[];
char wrbuf[];
char tmp[];
int revlen;
/*---------------------socket-------------------*/
if((listenfd = socket(AF_INET,SOCK_STREAM,))== -){
perror("socket() error\n");
exit();
} /*----------------------IO-----------------------*/
printf("Please input the ip:\n");
scanf("%s",ip);
printf("Please input the port:\n");
scanf("%d",&port); /*---------------------bind----------------------*/
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(ip);
if(bind(listenfd,(struct sockaddr *)&server,sizeof(server))== -){
perror("bind() error\n");
exit();
} /*----------------------listen-------------------*/
if (listen(listenfd,)== -){
perror("listen() error\n");
exit();
} /*----------------------accept------------------*/
addrlen = sizeof(client);
if((connetfd = accept(listenfd,(struct sockaddr *)&client,&addrlen))== -){
perror("accept() error\n");
exit();
}
/*---------------------show client---------------*/
printf("connect successful!\n");
printf("the client ip is %s,port is %d\n",inet_ntoa(client.sin_addr),ntohs(port)); /*----------------------read and write----------*/
int serial = ;
while(){
bzero(rebuf,sizeof(rebuf));
revlen = read(connetfd,rebuf,sizeof(rebuf));
if((memcmp("bye",rebuf,))== ){
printf("Bye-bye then close the connect...\n");
break;
}
bzero(wrbuf,sizeof(wrbuf));
bzero(tmp,sizeof(tmp));
sprintf(tmp,"%d",serial);
strcat(tmp,rebuf);
bcopy(tmp,wrbuf,strlen(tmp));
write(connetfd,wrbuf,sizeof(wrbuf));
rebuf[revlen] = '\0';
printf("the info from client is:%s\n",rebuf);
serial++;
} /*----------------------close-------------------*/
close(connetfd);
close(listenfd); return ;
}

客户端实现:

/*       TcpClient.c
copyright@msxh 2015/09/21
*/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h> int main(){
int sockfd;
char wrbuf[];
char ip[];
int port;
int revlen;
char rebuf[];
struct sockaddr_in server; /*---------------------socket---------------------*/
if((sockfd = socket(AF_INET,SOCK_STREAM,))== -){
perror("socket error\n");
exit();
} /*---------------------connect--------------------*/
printf("Please input the ip:\n");
scanf("%s",ip);
printf("Please input the port:\n");
scanf("%d",&port);
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
inet_aton(ip,&server.sin_addr);
if(connect(sockfd,(struct sockaddr *)&server,sizeof(server))== -){
perror("connect() error\n");
exit();
} /*-----------------------read and write------------------*/
while(){
bzero(wrbuf,sizeof(wrbuf));
bzero(rebuf,sizeof(rebuf));
printf("Please input the info:\n");
scanf("%s",wrbuf);
if((memcmp("bye",wrbuf,))== ){
write(sockfd,wrbuf,strlen(wrbuf));
printf("Bye-bye then close the connect...\n");
break;
}
//printf("%s\n",wrbuf);
write(sockfd,wrbuf,strlen(wrbuf));
revlen = read(sockfd,rebuf,sizeof(rebuf));
rebuf[revlen] = '\0';
printf("The info from server is: %s\n",rebuf);
}
/*------------------------close--------------------------*/
close(sockfd); return ;
}

makefile文件:

main:tcpserver.c tcpclient.c
gcc -o tcpserver tcpserver.c
gcc -o tcpclient tcpclient.c

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

最新文章

  1. 安卓app中嵌入一个H5页面,当手机系统设置字体变大时,如何使H5页面的字体不会随用户自己调整的系统字体变化而变化?
  2. faster alter table add column
  3. POJ 2886 Who Gets the Most Candies?
  4. C#的Socket简单实现消息发送
  5. opencv里面CV_32FC1家族
  6. git 删除分支和删除文件夹
  7. mevan引入容联云通讯jar
  8. linux中断--进程上下文和中断上下文
  9. pig 的chararry不能用于比较的类型可以comparison operator
  10. JAVA基础知识(2)--队列的操作
  11. Alamofire源码解读系列(十)之序列化(ResponseSerialization)
  12. 配置Tomcat
  13. Java反射机制(创建Class对象的三种方式)
  14. TCP三次握手详解及释放连接过程
  15. (最长回文子串 线性DP) 51nod 1088 最长回文子串
  16. html(常用标签,标签分类),页面模板, CSS(css的三种引入方式),三种引入方式优先级
  17. Summary on mapreduce.framework.name init error
  18. C# 爬虫 正则、NSoup、HtmlAgilityPack、Jumony四种方式抓取小说
  19. 代码管理(三)sourcetree 的使用
  20. HTTP状态码 解析

热门文章

  1. ris&#39;In App Purchase总结
  2. Android计时器实例
  3. 替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树
  4. 用Python操纵MySQL
  5. 20个很有用的PHP类库
  6. 《转》常用Petri网模拟软件工具简介
  7. Subarray Sum &amp; Maximum Size Subarray Sum Equals K
  8. c++11之bind
  9. DLL工程没有生成对应的lib文件
  10. Eclipse设置C++自动补全变量名快捷键Alt + /