C语言服务器的搭建

服务器:

1 创建套接字---->socket

2 绑定服务器地址--->bind(设置服务器地址struct sockaddr_in)

3 监听---->listen

4 接受---->accept

5 通信---->read/write

客户端:

1 创建套接字---->socket

2 链接--->connect

5 通信---->read/write

服务器

1 创建套接字---->socket

函数原型    //    int socket(int domain, int type, int protocol);

domain    //    AF_INET:使用ipv4协议来实现远程通讯

type    //    SOCK_STREAM:使用可靠传输

protocol    //    0:使用选择传输的默认协议(SOCK_STREAM-->tcp)

int sockFD = socket(AF_INET,SOCK_STREAM,0);


2 绑定服务器地址--->bind(设置服务器地址struct sockaddr_in)

函数原型    //    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd    //    为 1 中生成的sockFD

struct sockaddr{

    sa_family_t    sa_family;

    char    sa_data[14];

};

sturct sockaddr_in{

    short    sin_family;//协议

    unsigned short    sin_port;//端口号

    struct in_addr    sin_addr;//ip地址

    unsigned char    sin_zero[8];//为了填空

};

typedef unit_32t in_addr_t;

struct in_addr{

    in_addr_t    s_addr;

};

用 结构体 sockaddr_in 代替 aockaddr ,将数据传入 sockaddr_in。


struct sockaddr_in serAddr;

serAddr.sin_family = AF_INET; //使用ipv4协议通讯

htons:将本地字节序转换成网络字节序 host to network short

serAddr.sin_port = htons(6666);


inet_addr:将点分十进制字符串表示的ip转换成整数

serAddr.sin_addr.s_addr = inet_addr("192.168.137.128");

另外一种设置ip地址的方法

函数原型 int inet_pton(int af, const char *src, void *dst);

inet_pton(AF_INET, "192.168.1.37", &sin.sin_addr.s_addr);


将sockfd和指定的ip,port绑定,这样我们就可以通过sockfd收发该ip,port上的数据

bind(sockFD,(struct sockaddr*)&serAddr,sizeof(serAddr))

注意这里要将 sockaddr_in* 强转为 sockaddr*


3 监听---->listen

函数原型    //    int listen(int sockfd, int backlog);

listen(serSockFD,20);

将sockfd设置为监听状态

20:表示客户端连接缓冲队列的大小


4 接受---->accept

函数原型    //    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

accept的参数在之前 2 中都已经详细介绍过了。

struct sockaddr_in cliAddr;

int newSockFD = -1;

int iAddrLen = sizeof(cliAddr);

newSockFD = accept(serSockFD,(struct sockaddr*)&cliAddr,&iAddrLen);

若没有客户端连接,则阻塞等待,接收从sockfd监听到的客户端会自动的将连接过来的客户端的ip,port等信息放入clientAddr中。函数成功会自动创建一个socket,专门用于服务器和该客户端数据交互。


5 通信---->read/write

一般将读写将给子进程处理

pthread_t threadForClient;

pthread_create(&threadForClient,NULL,handleClient,(void*)newSockFD);

子进程处理函数

void *handleClient(void *arg)

{

    int sockFD = (int)arg;

    write(sockfd, (char*)sendpdu, sendsize);

    read(sockfd, (char*)revpdu, revsize);

}

客户端

客户端的操作和服务器基本一致,下面是客户端代码:

//1 创建套接字

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

int ser_fd = socket(AF_INET, SOCK_STREAM, 0); //tcp

if(ser_fd < 0){

return -1;

}

//设置服务器地址

struct sockaddr_in sin;

memset(&sin, 0, sizeof(sin));

sin.sin_family = AF_INET; //设置协议族

sin.sin_port = htons(5555); //设置端口号(大端字节序)

//设置ip地址

int inet_pton(int af, const char *src, void *dst);

if(inet_pton(AF_INET, "192.168.1.37", &sin.sin_addr.s_addr) < 0){

return -1;

}

//2 链接服务器

int connect(int sockfd, const struct sockaddr *addr,

                  socklen_t addrlen);

if(connect(ser_fd, (const struct sockaddr*)&sin, sizeof(sin)) < 0){

return -1;

}

//数据传输

while(True){

//write/read

char buff[128] = {0};

printf("请输入一个字符串: ");

scanf("%s", buff);

//写向服务器

ssize_t write(int fd, const void *buf, size_t count);

write(ser_fd, buff, sizeof(buff));

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,197评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,415评论 3 415
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,104评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,884评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,647评论 6 408
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,130评论 1 323
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,208评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,366评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,887评论 1 334
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,737评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,939评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,478评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,174评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,586评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,827评论 1 283
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,608评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,914评论 2 372

推荐阅读更多精彩内容

  • 下面为Daytime这个服务的源代码例子,同时兼容IPV6和IPV4的地址,最后部分有更多说明。 单播模式下的Se...
    天楚锐齿阅读 5,723评论 0 2
  • 网络模型 物理层 物理层表示的是比特流传输,通常包括串口/COM口、并行/LPT口、USB、网线接口、电话线接口;...
    秋风弄影阅读 731评论 0 2
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,401评论 0 5
  • 系统与网络编程 OSI模型 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层 socket 在网络编程中...
    I踏雪寻梅阅读 857评论 0 1
  • 三月是风的季节 春风和煦 温暖惬意 如你的大手 抚摸我的脸颊 三月是放风筝的季节 迎风招展 恣意妄为 似你的情意 ...
    许你一世情缘阅读 371评论 0 0