当前位置:   article > 正文

linux下tcp连接简单测试_linux tcp怎么测试接口

linux tcp怎么测试接口

1.预备知识介绍

以下函数发生错误均可查看errno错误原因

int socket(int domain, int type,int protocol)

举例:socket(AF_INET,SOCK_STREAM,0);

头文件:

#include<sys/systypes.h>

#include<sys/socket.h>

第一个参数是指协议族类型,第二个参数表示套接字通信的类型,第三个表示一个协议的不同种类选择,只有一种就是0.

返回值失败返回-1,成功返回这个socket对应的文件描述符。

int bind(int sockfd,const struct sockaddr *my_addr,socklen_t addrlen)

第一个参数是对应socket的文件描述符

第二个参数是指向sockaddr结构的指针,这个结构包含地址,端口和ip信息

第三个参数是长度,一般用sizeof(struct sockaddr)即可

int listen(int sockfd,int backlog)

第一个参数是socket对应文件描述符,第二个参数是accept函数处理之前等待队列中客户端的个数,超过这个个数客户端就会返回一个ECONNREFUSED错误

当listen成功运行时,返回值是0,运行失败返回-1;有些协议可能不支持listen,如SOCK_DGRAM

接受一个网络请求accept

int  accept(int sockfd,struct sockaddr *addr, socklen_t *addrlen);

该函数返回值是客户端socket的文件描述符

通过该函数可以获得客户端的IP地址,端口和协议等等,存在addr指针中。

int connect(int sockfd,struct sockaddr* ,int addrlen)

该函数成功返回0,发生错误返回-1.

第一个参数为建立客户端套接字返回的文件描述符

第二个参数为指针,包括客户端需要连接服务器的目的端口和IP地址,以及协议类型。第三个参数设为sizeof(struct sockaddr)即可

2.测试程序

服务器端(tcpserver.c)

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<strings.h>
  4. #include<sys/types.h>
  5. #include<sys/socket.h>
  6. #include<unistd.h>
  7. #include<arpa/inet.h>
  8. #define port 8888
  9. #define queuelong 2 //监听队列长度
  10. void process_conn_server(int s) //处理客户端传过来的消息,参数为客户端socket的描述符
  11. {
  12. ssize_t size=0;
  13. char buffer[1024];
  14. for(;;)
  15. {
  16. size=read(s,buffer,1024); //从客户端socket读数据
  17. if(size==0)return ;
  18. //构建响应字符,为接收到客户端字节数量
  19. sprintf(buffer,"%d bytes altogether\n",size); //写在buffer里
  20. write(s,buffer,strlen(buffer)+1); //发送给客户端
  21. }
  22. }
  23. int main(int argc,int *argv[])
  24. {
  25. int ss,sc; //ss为服务器socket描述符,sc为客户端socket描述符
  26. struct sockaddr_in server_addr; //服务器地址结构
  27. struct sockaddr_in client_addr; //客户端地址结构
  28. int err; //返回值
  29. pid_t pid; //分支进程号
  30. //建立套接字
  31. ss=socket(AF_INET,SOCK_STREAM,0);
  32. if(ss<0)
  33. {
  34. printf("socket error!!!");
  35. return -1;
  36. }
  37. //设置服务器地址
  38. bzero(&server_addr,sizeof(server_addr)); //清零
  39. server_addr.sin_family=AF_INET; //协议类型
  40. server_addr.sin_addr.s_addr=htonl(INADDR_ANY); //
  41. server_addr.sin_port=htons(port); //端口
  42. //将设置好的网络地址结构与套接字绑定
  43. err=bind(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));
  44. if(err<0)
  45. {
  46. printf("listen error!");
  47. return -1;
  48. }
  49. err=listen(ss,queuelong); //监听
  50. if(err<0)
  51. {
  52. printf("listen failed!");
  53. return -1;
  54. }
  55. printf("bind is over!");
  56. //主循环
  57. for(;;)
  58. {
  59. socklen_t addrlen=sizeof(struct sockaddr);
  60. sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen); //接受客户端请求
  61. if(sc<0)
  62. continue;
  63. pid=fork(); //为每一个客户请求复制一个子进程
  64. printf("sub process is create!");
  65. if(pid==0)
  66. {
  67. close(ss);
  68. process_conn_server(sc); //子进程处理
  69. }
  70. else
  71. close(sc);
  72. }

 

客户端(tcpclient.c)

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<string.h>
  4. #include<sys/types.h>
  5. #include<sys/socket.h>
  6. #include<arpa/inet.h>
  7. #define PORT 8888
  8. void process_conn_client(int s)
  9. {
  10. ssize_t size=0;
  11. char buffer[1024];
  12. for(;;)
  13. {
  14. size=read(0,buffer,1024); //从标准输入读入数据
  15. if(size>0)
  16. {
  17. write(s,buffer,size); //给服务器写数据
  18. size=read(s,buffer,1024); //读数据
  19. write(1,buffer,size);//向屏幕写
  20. }
  21. }
  22. }
  23. int main(int argc,char *argv[])
  24. {
  25. int s; //socket描述符
  26. struct sockaddr_in server_addr;
  27. s=socket(AF_INET,SOCK_STREAM,0); //建立客户端socket
  28. if(s<0)
  29. {
  30. printf("socket error!!");
  31. return -1;
  32. }
  33. //设置连接的服务器地址
  34. bzero(&server_addr,sizeof(server_addr)); //清零
  35. server_addr.sin_family=AF_INET; //协议类型
  36. server_addr.sin_addr.s_addr=htonl(INADDR_ANY); //ip--这里是任意地网卡地址
  37. server_addr.sin_port=htons(PORT); //端口
  38. //将用户输入的字符串类型的ip地址转换成整形
  39. inet_pton(AF_INET,argv[1],&server_addr.sin_addr);
  40. printf("begin to connect!");
  41. //连接服务器
  42. connect(s,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
  43. process_conn_client(s);
  44. printf("process_conn_client is over!");
  45. close(s);
  46. return 0;
  47. }

3.测试及结果

分别编译两个.c文件,得到两个可执行文件

先开一个终端,执行tcpserver

再开一个执行:

以上就是效果!

最后总结一下linux下tcp的步骤

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/957899
推荐阅读
相关标签
  

闽ICP备14008679号