首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

TCP服务器端和客户端程序设计(2)

TCP服务器端和客户端程序设计(2)

(2)read()函数用于数据的接收。

-------------------------------------------------------------------
#include <unistd.h>         
int read(int sockfd, char *buf, intlen);  
  回:非负---成功   -1---失败
-------------------------------------------------------------------

参数sockfd是套接字描述符,对于服务器是accept()函数返回的已连接套接字描述符,对于客户端是调用socket()函数返回的套接字描述符;参数buf是指向一个用于接收信息的数据缓冲区;len指明接收数据缓冲区的大小。

7、send和recv函数:TCP套接字提供了send()和recv()函数,用来发送和接收操作。这两个函数与write()和read()函数很相似,只是多了一个附加的参数。

(1)send()函数用于数据的发送。

-------------------------------------------------------------------
#include <sys/types.h>
#include < sys/socket.h >         
ssize_t send(int sockfd, const void *buf, size_t len, int flags);  
  回:返回写出的字节数---成功   -1---失败
-------------------------------------------------------------------

前3个参数与write()相同,参数flags是传输控制标志。

(2)recv()函数用于数据的发送。

-------------------------------------------------------------------
#include <sys/types.h>
#include < sys/socket.h >         
ssize_t recv(int sockfd, void *buf, size_t len, int flags);  
  回:返回读入的字节数---成功   -1---失败
-------------------------------------------------------------------

前3个参数与read()相同,参数flags是传输控制标志。


五、实验步骤
1、登陆进入ubuntu操作系统,新建一个文件,命名为tcpserver.c(为了方便起见,可以进入“home”,再进入用户目录,在用户目录下新建tcpserver.c)。
2、在tcpserver.c中编写服务器端程序代码并保存。
3、在“终端”(“Applications”→“附件”→“终端”)中执行命令进入tcpserver.c所在目录。(pwd命令可以显示当前所在目录;ls命令可以显示当前目录下的文件和文件夹信息;cd..命令可以进入上一级目录;cd 目录名 命令可以进入当前所示的某个目录。)
4、执行命令gcc –o tcpserver tcpserver.c生成可执行文件tcpserver。
5、执行命令./ tcpserver,观察结果。
6、认真分析源代码,体会如何编写一个TCP服务器端程序。
六、参考程序(tcpserver.c
   

[cpp] view plaincopy

  • #include <stdio.h>
  •        #include <stdlib.h>
  •        #include <string.h>
  •        #include <unistd.h>
  •        #include <sys/types.h>
  •        #include <sys/socket.h>
  •        #include <netinet/in.h>
  •        #include <arpa/inet.h>

  •        #define  PORT 1234
  •        #define  BACKLOG 1

  •        int main()  
  •        {  
  •        int  listenfd, connectfd;  
  •        struct  sockaddr_in server;  
  •        struct  sockaddr_in client;  
  •        socklen_t  addrlen;  
  •        if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)  
  •        {  
  •        perror("Creating  socket failed.");  
  •        exit(1);  
  •        }  
  •        int opt =SO_REUSEADDR;  
  •        setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));  
  •        bzero(&server,sizeof(server));  
  •        server.sin_family=AF_INET;  
  •        server.sin_port=htons(PORT);  
  •        server.sin_addr.s_addr= htonl (INADDR_ANY);  
  •        if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1) {  
  •        perror("Binderror.");  
  •        exit(1);  
  •        }     
  •        if(listen(listenfd,BACKLOG)== -1){  /* calls listen() */
  •        perror("listen()error\n");  
  •        exit(1);  
  •        }  
  •        addrlen =sizeof(client);  
  •        if((connectfd = accept(listenfd,(struct sockaddr*)&client,&addrlen))==-1) {  
  •        perror("accept()error\n");  
  •        exit(1);  
  •        }  
  •        printf("Yougot a connection from cient's ip is %s, prot is %d\n",inet_ntoa(client.sin_addr),htons(client.sin_port));  
  •        send(connectfd,"Welcometo my server.\n",22,0);  
  •        close(connectfd);  
  •        close(listenfd);  
  • return 0;  
  •        }  
继承事业,薪火相传
返回列表