原创文章,转载请注明转载字样和出处,谢谢!

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

程序说明: 这里server的port号和ip地址使用固定的设置,移植时能够依据详细情况更改,能够改写为參数传递更好,这里为了方便,使用固定的。

移植时服务端能够不用更改,编译后可直接执行;client将ip改为server的地址,然后编译执行。能够使用netstat 进行查看对应的执行状态。

/*************************************
文件名称: server.c
linux 下socket网络编程简例 - 服务端程序
serverport设为 0x8888 (port和地址可依据实际情况更改,或者使用參数传入)
server地址设为 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"); /* 填充serverport地址信息,以便以下使用此地址和port监听 */
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进行绑定port */
if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{
printf("bind fail !\r\n");
return -1;
}
printf("bind ok !\r\n");
/* 開始监听对应的port */
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服务端使用函数,调用时即进入堵塞状态,等待用户进行连接,在没有client进行连接时,程序停止在此处,
不会看到后面的打印,当有client进行连接时,程序立即运行一次,然后再次循环到此处继续等待。
此处accept的第二个參数用于获取client的port和地址信息。
*/
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向client发送信息,也能够尝试使用其它函数实现 */
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;
}
/*************************************
文件名称: client.c
linux 下socket网络编程简例 - client程序
serverport设为 0x8888 (port和地址可依据实际情况更改,或者使用參数传入)
server地址设为 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、port等信息结构体 */
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");
/* 构造server端的ip和port信息,详细结构体能够查资料 */
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); /* 这里打印出的是小端
和我们平时看到的是相反的。 */ /* client连接server,參数依次为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. Cfree clion windows c语言 socket 网络编程

    server.c #include <stdio.h> #include <winsock2.h> #define SERVER_PORT 5208 //侦听端口 int ma ...

  3. Linux下C语言socket通信实现发送读取的文件内容--简单实现代码

    本次代码涉及到的内容:socket通讯,文件读取 读取的文件以及文件位置: 要读取的文件和c文件在同一个目录下.客户端(client)读取的是123.xml,服务端(server)读取的是23.xml ...

  4. linux下c语言的多线程编程

    我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执 ...

  5. Linux下C语言进程通讯编程

    代码: #include <stdio.h> #include <stdlib.h> #include <sys/shm.h> /*************基本的函 ...

  6. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  7. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  8. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...

  9. windows下的socket网络编程(入门级)

    windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之0903文件读写

       题目

  2. Android 它们的定义View它BounceProgressBar

    转载请注明出处:http://blog.csdn.net/bbld_/article/details/41246247 [Rocko's blog] 之前几天下载了非常久没用了的桌面版酷狗来用用的时候 ...

  3. Route@书写规则的总结

    路由书写规则的总结 概念:Routing System由一组路由组成,每一个路由规则可以匹配一种类型的URL,在请求过来的时候,Ruting ystem 就用它来处理这个URL,路由的任务就是匹配UR ...

  4. c语言,结构体

    数据类型分为4种, 简单数据类型,构造数据类型,指针数据类型,空类型. 结构体属于构造数据类型,用struct标识. 声明一个结构体: Typedef  struct和struct c c++ typ ...

  5. windows azure 实例

    public class Album : TableServiceEntity { } public class PhotoAlbumDataContext : TableServiceContext ...

  6. 终于懂了:Delphi消息的Result完全是生造出来的,不是Windows消息自带的(Delphi对Windows编程体系的改造越大,学习收获就越大)——消息是否继续传递就看这个Result

    Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据的含义也不一样. t ...

  7. 『WPF』DataGrid的使用

    原文 『WPF』DataGrid的使用 几点说明 这里主要是参考了MSDN中关于DataGrid的说明 这里只会简单说明在WPF中,DataGird最简单的使用方法 对于MSDN中的翻译不会很详细,也 ...

  8. java layout 表格项增加、删除、修改

    实现的内容为:点击表格某项,再点击删除钮,可实现删除点击表格某项,再点击编辑按钮,可实现内容改变点击添加按钮,可实现向表格中添加内容 总结:总的来说中间遇到了很多困难,但是都一步步的解决了. pack ...

  9. Spring 从零開始-05

    最终能到Spring的AOP编程了,AOP的概念特别的多.所以须要你在開始之前有点了解,然后通过代码慢慢学习! - 切面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象.事务管 ...

  10. HDU1257 最小拦截系统 【贪婪】

    最小拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...