linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢!
这里给出在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网络编程简例的更多相关文章
- 5.3linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...
- Cfree clion windows c语言 socket 网络编程
server.c #include <stdio.h> #include <winsock2.h> #define SERVER_PORT 5208 //侦听端口 int ma ...
- Linux下C语言socket通信实现发送读取的文件内容--简单实现代码
本次代码涉及到的内容:socket通讯,文件读取 读取的文件以及文件位置: 要读取的文件和c文件在同一个目录下.客户端(client)读取的是123.xml,服务端(server)读取的是23.xml ...
- linux下c语言的多线程编程
我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执 ...
- Linux下C语言进程通讯编程
代码: #include <stdio.h> #include <stdlib.h> #include <sys/shm.h> /*************基本的函 ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
- windows下的socket网络编程(入门级)
windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...
随机推荐
- JAVA_2Lesson
package test; public class abc { public static void main(String[] arg) { int[][] xx=new int[3][]; xx ...
- 安装DBMS_SHARED_POOL包
在安装10g gc的时候,会遇到The DBMS_SHARED_POOL package is not executed on the Existing Database这样的一个错误,意思是提示你D ...
- 在前端页面中使用@font-face来显示web自定义字体【转】
本文转自W3CPLUS 的<CSS @font-face> @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现, ...
- UVA 11292 - The Dragon of Loowater (water)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=sh ...
- javascript笔记整理(函数)
javascript函数的声明和调用将完成某一特定功能的代码集合起来,可以重复使用的代码块. 一.函数的声明方式(创建) A.基本语法(function 关键字)function 函数名([参数1] ...
- 【虚拟化实战】容灾设计之一VR vs SRM
作者:范军 (Frank Fan) 新浪微博:@frankfan7 从本文开始,我们将介绍一系列的关于容灾的解决方案.先探讨应用的场景,然后再深入介绍技术架构. 情景一: 某小型公司的虚拟化环境中,在 ...
- Oracle多表的简单查询
Oracle多表的简单查询 .多表查询 多表查询是指基于两个和两个以上的表或是视图的查询. 问题:显示雇员名,雇员工资及所在部门的名字[笛卡尔集]? select t.ename,t.sal,t1.d ...
- [放松一下] 经典高清电影合集 170G BT种子下载
经典高清电影合集 170G BT种子下载 点击文件名下载 经典高清电影合集170G BT种子.torrent 下载方法 经典高清电影合集详情见目录: 1. 杀手47 2. 这个杀手不太冷 3. 放牛班 ...
- pthread_setschedprio()函数详解!!!
pthread_setschedprio() Set a thread's priority 用于设置现成的优先级 包含在头文件 #include <pthread.h> 用法:int p ...
- windows 2003 DNS服务的重建
DNS的重建 网络上转载之文章,据说来自微软官方,留下一份自己用,曾经帮助我解决了DNS方面的困扰,希望能给大家带来帮助 1.打开dns管理器,删除domain.com区域,如果存在_msdcs.do ...