转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405

在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了,一直检查不出来,看了该例,才找到自己逻辑上的错误 !

这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端;客户端在接受到数据后打印出来,然后关闭。程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料。

程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的。

移植时服务端可以不用更改,编译后可直接运行;客户端将ip改为服务器的地址,然后编译运行。可以使用netstat 进行查看相应的运行状态。

[cpp] view plaincopy print?
  1. /*************************************
  2. 文件名: server.c
  3. linux 下socket网络编程简例  - 服务端程序
  4. 服务器端口设为 0x8888   (端口和地址可根据实际情况更改,或者使用参数传入)
  5. 服务器地址设为 192.168.1.104
  6. 作者:kikilizhm#163.com (将#换为@)
  7. */
  8. #include <stdlib.h>
  9. #include <sys/types.h>
  10. #include <stdio.h>
  11. #include <sys/socket.h>
  12. #include <linux/in.h>
  13. #include <string.h>
  14. int main()
  15. {
  16. int sfp,nfp; /* 定义两个描述符 */
  17. struct sockaddr_in s_add,c_add;
  18. int sin_size;
  19. unsigned short portnum=0x8888; /* 服务端使用端口 */
  20. printf("Hello,welcome to my server !\r\n");
  21. sfp = socket(AF_INET, SOCK_STREAM, 0);
  22. if(-1 == sfp)
  23. {
  24. printf("socket fail ! \r\n");
  25. return -1;
  26. }
  27. printf("socket ok !\r\n");
  28. /* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */
  29. bzero(&s_add,sizeof(struct sockaddr_in));
  30. s_add.sin_family=AF_INET;
  31. s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 这里地址使用全0,即所有 */
  32. s_add.sin_port=htons(portnum);
  33. /* 使用bind进行绑定端口 */
  34. if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
  35. {
  36. printf("bind fail !\r\n");
  37. return -1;
  38. }
  39. printf("bind ok !\r\n");
  40. /* 开始监听相应的端口 */
  41. if(-1 == listen(sfp,5))
  42. {
  43. printf("listen fail !\r\n");
  44. return -1;
  45. }
  46. printf("listen ok\r\n");
  47. while(1)
  48. {
  49. sin_size = sizeof(struct sockaddr_in);
  50. /* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处,
  51. 不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。
  52. 此处accept的第二个参数用于获取客户端的端口和地址信息。
  53. */
  54. nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
  55. if(-1 == nfp)
  56. {
  57. printf("accept fail !\r\n");
  58. return -1;
  59. }
  60. printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
  61. /* 这里使用write向客户端发送信息,也可以尝试使用其他函数实现 */
  62. if(-1 == write(nfp,"hello,welcome to my server \r\n",32))
  63. {
  64. printf("write fail!\r\n");
  65. return -1;
  66. }
  67. printf("write ok!\r\n");
  68. close(nfp);
  69. }
  70. close(sfp);
  71. return 0;
  72. }
/*************************************
文件名: server.c
linux 下socket网络编程简例  - 服务端程序
服务器端口设为 0x8888   (端口和地址可根据实际情况更改,或者使用参数传入)
服务器地址设为 192.168.1.104
作者:kikilizhm#163.com (将#换为@)
*/#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>int main()
{
int sfp,nfp; /* 定义两个描述符 */
struct sockaddr_in s_add,c_add;
int sin_size;
unsigned short portnum=0x8888; /* 服务端使用端口 */printf("Hello,welcome to my server !\r\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfp)
{printf("socket fail ! \r\n");return -1;
}
printf("socket ok !\r\n");/* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 这里地址使用全0,即所有 */
s_add.sin_port=htons(portnum);
/* 使用bind进行绑定端口 */
if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{printf("bind fail !\r\n");return -1;
}
printf("bind ok !\r\n");
/* 开始监听相应的端口 */
if(-1 == listen(sfp,5))
{printf("listen fail !\r\n");return -1;
}
printf("listen ok\r\n");while(1)
{
sin_size = sizeof(struct sockaddr_in);
/* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处,不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。此处accept的第二个参数用于获取客户端的端口和地址信息。*/
nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
if(-1 == nfp)
{printf("accept fail !\r\n");return -1;
}
printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));/* 这里使用write向客户端发送信息,也可以尝试使用其他函数实现 */
if(-1 == write(nfp,"hello,welcome to my server \r\n",32))
{printf("write fail!\r\n");return -1;
}
printf("write ok!\r\n");
close(nfp);}
close(sfp);
return 0;
}
[cpp] view plaincopy print?
  1. /*************************************
  2. 文件名: client.c
  3. linux 下socket网络编程简例  - 客户端程序
  4. 服务器端口设为 0x8888   (端口和地址可根据实际情况更改,或者使用参数传入)
  5. 服务器地址设为 192.168.1.104
  6. 作者:kikilizhm#163.com (将#换为@)
  7. */
  8. #include <stdlib.h>
  9. #include <sys/types.h>
  10. #include <stdio.h>
  11. #include <sys/socket.h>
  12. #include <linux/in.h>
  13. #include <string.h>
  14. int main()
  15. {
  16. int cfd; /* 文件描述符 */
  17. int recbytes;
  18. int sin_size;
  19. char buffer[1024]={0};    /* 接受缓冲区 */
  20. struct sockaddr_in s_add,c_add; /* 存储服务端和本端的ip、端口等信息结构体 */
  21. unsigned short portnum=0x8888;  /* 服务端使用的通信端口,可以更改,需和服务端相同 */
  22. printf("Hello,welcome to client !\r\n");
  23. /* 建立socket 使用因特网,TCP流传输 */
  24. cfd = socket(AF_INET, SOCK_STREAM, 0);
  25. if(-1 == cfd)
  26. {
  27. printf("socket fail ! \r\n");
  28. return -1;
  29. }
  30. printf("socket ok !\r\n");
  31. /* 构造服务器端的ip和端口信息,具体结构体可以查资料 */
  32. bzero(&s_add,sizeof(struct sockaddr_in));
  33. s_add.sin_family=AF_INET;
  34. s_add.sin_addr.s_addr= inet_addr("192.168.1.104"); /* ip转换为4字节整形,使用时需要根据服务端ip进行更改 */
  35. s_add.sin_port=htons(portnum); /* 这里htons是将short型数据字节序由主机型转换为网络型,其实就是
  36. 将2字节数据的前后两个字节倒换,和对应的ntohs效果、实质相同,只不过名字不同。htonl和ntohl是
  37. 操作的4字节整形。将0x12345678变为0x78563412,名字不同,内容两两相同,一般情况下网络为大端,
  38. PPC的cpu为大端,x86的cpu为小端,arm的可以配置大小端,需要保证接收时字节序正确。
  39. */
  40. printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port); /* 这里打印出的是小端
  41. 和我们平时看到的是相反的。 */
  42. /* 客户端连接服务器,参数依次为socket文件描述符,地址信息,地址结构大小 */
  43. if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
  44. {
  45. printf("connect fail !\r\n");
  46. return -1;
  47. }
  48. printf("connect ok !\r\n");
  49. /*连接成功,从服务端接收字符*/
  50. if(-1 == (recbytes = read(cfd,buffer,1024)))
  51. {
  52. printf("read data fail !\r\n");
  53. return -1;
  54. }
  55. printf("read ok\r\nREC:\r\n");
  56. buffer[recbytes]='\0';
  57. printf("%s\r\n",buffer);
  58. getchar(); /* 此句为使程序暂停在此处,可以使用netstat查看当前的连接 */
  59. close(cfd); /* 关闭连接,本次通信完成 */
  60. return 0;
  61. }
/*************************************
文件名: client.c
linux 下socket网络编程简例  - 客户端程序
服务器端口设为 0x8888   (端口和地址可根据实际情况更改,或者使用参数传入)
服务器地址设为 192.168.1.104
作者:kikilizhm#163.com (将#换为@)
*/#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>int main()
{
int cfd; /* 文件描述符 */
int recbytes;
int sin_size;
char buffer[1024]={0};    /* 接受缓冲区 */
struct sockaddr_in s_add,c_add; /* 存储服务端和本端的ip、端口等信息结构体 */
unsigned short portnum=0x8888;  /* 服务端使用的通信端口,可以更改,需和服务端相同 */printf("Hello,welcome to client !\r\n");
/* 建立socket 使用因特网,TCP流传输 */
cfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == cfd)
{printf("socket fail ! \r\n");return -1;
}
printf("socket ok !\r\n");
/* 构造服务器端的ip和端口信息,具体结构体可以查资料 */
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr= inet_addr("192.168.1.104"); /* ip转换为4字节整形,使用时需要根据服务端ip进行更改 */
s_add.sin_port=htons(portnum); /* 这里htons是将short型数据字节序由主机型转换为网络型,其实就是将2字节数据的前后两个字节倒换,和对应的ntohs效果、实质相同,只不过名字不同。htonl和ntohl是操作的4字节整形。将0x12345678变为0x78563412,名字不同,内容两两相同,一般情况下网络为大端,PPC的cpu为大端,x86的cpu为小端,arm的可以配置大小端,需要保证接收时字节序正确。*/printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port); /* 这里打印出的是小端和我们平时看到的是相反的。 *//* 客户端连接服务器,参数依次为socket文件描述符,地址信息,地址结构大小 */
if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{printf("connect fail !\r\n");return -1;
}
printf("connect ok !\r\n");
/*连接成功,从服务端接收字符*/
if(-1 == (recbytes = read(cfd,buffer,1024)))
{printf("read data fail !\r\n");return -1;
}
printf("read ok\r\nREC:\r\n");buffer[recbytes]='\0';
printf("%s\r\n",buffer);getchar(); /* 此句为使程序暂停在此处,可以使用netstat查看当前的连接 */
close(cfd); /* 关闭连接,本次通信完成 */
return 0;}

运行截图:

linux下C语言socket网络编程简例相关推荐

  1. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  2. Linux下的Python Socket网络编程(聊天机器人)

    转载文章: https://blog.csdn.net/slavik_/article/details/82430717

  3. 以下是UNIX linux 下c语言的图形编程  curses库

    UNIX下c语言的图形编程--curses.h 函式库 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-22 19:39:36 减小字体 增大字体 相信您在网路上一定用过 ...

  4. Linux下c语言的图形编程(转) curses.h 函式库

    这是转贴哈,最近想吧TC的图形编程搞到LINUX下面来,所以就对其有所研究了哦. http://tech.techweb.com.cn/viewthread.php?tid=181892 注明了转载, ...

  5. Linux下C语言Socket编程

    (前期使用Ubuntu18.04,后期换成了Deepin20,但是二者都是Debian系的所以各种操作不耽误) 什么是Socket 英语socket是插座,插孔的意思,中文译作套接字: 插销和插座插在 ...

  6. Linux下C语言串口应用编程,Linux下串口C语言编程

    Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...

  7. Linux下c语言的图形编程

    简介 GTK+(GIMP TOOLKIT),是一个跨平台的图形界面(GUI)开发工具,是目前LINUX操作系统中较常用的图形界面开发工具之一,它采用一种非常有特色的面向对象的C语言开发框架(C Fra ...

  8. 基于Linux下的服务器搭建(网络编程)

    这是服务器,客户端是qt编写的.看情况再写吧 注意这是头文件: #include <stdio.h> #include <string.h> #include <stdl ...

  9. linux系统编程布局,Linux下c语言的图形编程

    GTK+(GIMP TOOLKIT),是一个跨平台的图形界面(GUI)开发工具,是目前LINUX操作系统中较常用的图形界面开发工具之一,它采用一种非常有特色的面向对象的C语言开发框架(C Framew ...

最新文章

  1. C语言的集成开发环境
  2. mongodb集群——配置服务器放分片meta信息,说明meta里包含了哪些数据信息
  3. hbase shell-namespace(命名空间指令)
  4. Service Mesh 从“趋势”走向“无聊”
  5. Numpy-矩阵的合并
  6. Java多线程系列--“JUC线程池”06之 Callable和Future
  7. 最佳约会策略及其证明
  8. 【转载】关于防火墙的初次接触
  9. bzoj千题计划127:bzoj1041: [HAOI2008]圆上的整点
  10. gdb调试mpi程序
  11. NYOJ1 - A+B Problem
  12. CF1139D Steps to One
  13. ubuntu上打开md文件_Ubuntu 使用教程.md
  14. 复制粘贴激活win10的方法--无毒
  15. 大学加权平均分计算器_澳大利亚移民宝藏专业----西澳大学幼教硕士解析
  16. 模电:晶振与匹配电容的总结
  17. 笔记本WIFI时断时续(已解决)2021
  18. 访问者模式Visitor
  19. 怎么把两段录音合并在一起?
  20. sklearn.exceptions.NotFittedError: Estimator not fitted, call fit before exploiting the model.

热门文章

  1. eclipse提示快捷键(alt+/)不起作用+设置自动提示
  2. 日期:在原有的时间上加一秒/分钟等
  3. 基于NodeJS导出excel
  4. 自动接听或者挂断来电
  5. 名片扫一扫识别OCR技术
  6. 根据生日计算星座 PHP
  7. 武汉大学中山大学计算机就业,中山大学与武汉大学:实力接近,规模相当,2021录取差距拉大...
  8. java-php-python-springboot中医保健网站计算机毕业设计
  9. LeetCode 周赛 334,在算法的世界里反复横跳
  10. ZBrush零基础雕刻教程,教你20分钟雕刻骷髅头