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

2023-05-16

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

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

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

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

/*************************************
文件名: 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;
}
/*************************************
文件名: 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;



}




转载于:https://www.cnblogs.com/xiaofeiwang/p/3825015.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下C语言socket网络编程简例 的相关文章

随机推荐

  • 启动ubuntu报"you need to load the kernel first"

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 我所用wubi安装的 xff0c 找到你wubi自动下载的那个镜像文件 xff0c 用winrar打开 xff0c 把casper目录中的vmlinuz和initrd lz
  • iOS: Crash文件解析(一)

    iOS Crash文件的解析 xff08 一 xff09 开发程序的过程中不管我们已经如何小心 xff0c 总是会在不经意间遇到程序闪退 脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候 xff0c 流畅的操作被无情地Crash
  • windows快捷键大全

    1 快速切换程序 xff1a Alt 43 Tab xff1b 2 永久删除文件Shift 43 Delete xff1b 3 秒开文件管理 xff1a Windows 43 E xff1b 4 直接显示桌面 xff1a Windows 4
  • mysql limit 用法-分页

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢 xff1f 不用担心 xff0c mysql已经为我们提供了这样一个
  • Knowledge Tracing -- 基于贝叶斯的学生知识点追踪(BKT)

    目前 xff0c 教育领域通过引入人工智能的技术 xff0c 使得在线的教学系统成为了智能教学系统 xff08 ITS xff09 xff0c ITS不同与以往的MOOC形式的课程 ITS能够个性化的为学生制定有效的 学习路径 xff0c
  • word显示计算机没有内存不足,Word提示内存或磁盘空间不足【解决方法】

    类型 xff1a 安卓软件 大小 xff1a 12 9MB 语言 xff1a 简体中文 Word提示内存或磁盘空间不足原因 近期很多用户打开Word系统会提示我们内存或磁盘空间不足 xff0c 其实这并非是我们电脑硬件或者系统的问题 xff
  • 中矿大 C 石头剪刀布【决策DP*待看/codeforces原题】

    时间限制 xff1a C C 43 43 1秒 xff0c 其他语言2秒 空间限制 xff1a C C 43 43 32768K xff0c 其他语言65536K 64bit IO Format lld 题目描述 齐齐和司机正在玩剪刀石头布
  • Python 面向对象(初级篇)

    51CTO同步发布地址 xff1a http 3060674 blog 51cto com 3050674 1689163 概述 面向过程 xff1a 根据业务逻辑从上到下写垒代码函数式 xff1a 将某功能代码封装到函数中 xff0c 日
  • 9个常用的开源工单系统

    工单系统 xff08 也称为问题跟踪系统 xff0c 故障工单系统 xff0c 支持工单或事件工单系统 xff09 是一个计算机软件包或基于Web的软件包 xff0c 用于管理和维护组织需要的问题列表 工单系统通常用于组织的创建 xff0c
  • 64位系统使用Access 数据库文件的彻底解决方法

    方案一 xff1a 大部分都建议将 NET程序编译的时候 xff0c 目标平台设定为 x86 方案二 xff1a 下载安装Microsoft Access Database Engine 2010 Redistributable xff08
  • python使用系统剪贴板进行复制粘贴

    一 使用pyperclip 首先使用pip进行安装 xff1a pip install pyperclip 使用起来也很简单 xff1a In span class token punctuation span span class tok
  • eclipse 粘贴字符串自动添加转义符

    eclipse gt Window gt Preferences gt Java gt Editor gt Typing gt 勾选 Escape text when pasting into a string literal
  • Python3基础入门自学教程

    版权地址 xff1a https www wistbean com pyth pick up Python 给大家说一下 xff0c 我要开始学习 Python 了 xff0c Python 最近很火嘛 xff08 小样 xff0c 别太膨
  • Python提取json数据

    import json jsonstring 61 39 34 user man 34 34 name 34 34 Peter 34 34 name 34 34 xiaoming 34 34 user woman 34 34 name 34
  • Error:Too many parameters found at '^' position.

    SW1 Eth Trunk1 dis th interface Eth Trunk1 mode lacp static max active linknumber 2 return SW1 Eth Trunk1 SW1 GigabitEth
  • 解决docker-compose 命令不存在、未找到命令错误

    1 安装扩展源 sudo yum y install epel release 2 安装python pip模块 sudo yum install python pip 3 查看docker compose版本 docker compose
  • 团队项目中应如何评价个人对团队的贡献?

    这是一个非常有用的问题 如果不仔细思考这个问题 xff0c 就会造成团队成员的不公平 积极性不高等问题 Shine团队的队员们 xff0c 可以在这篇随笔里畅所欲言 xff0c 我先来 xff1a 王安然 xff1a 对于一个项目来说 xf
  • Hash算法初见

    hash算法 hashmap 实现原理 Hash xff0c 一般翻译做 散列 xff0c 也有直接音译为 哈希 的 xff0c 就是把任意长度的输入 xff08 又叫做预映射 xff0c pre image xff09 xff0c 通过散
  • JS学习笔记

    1 空值 xff1a null xff0c undefined NaN Not a Number e g var bestAge 61 null null var currentCount undefined NaN 作比较时 xff0c
  • linux下C语言socket网络编程简例

    转自 http blog csdn net kikilizhm article details 7858405 这里给出在linux下的简单socket网络编程的实例 xff0c 使用tcp协议进行通信 xff0c 服务端进行监听 xff0