socket编程的最简单实例 - linux系统编程及驱动开发 - 小超嵌入式工作室 嵌入式开发学习交流论坛 XC-STC XC2440技术支持 - Powered by Discuz!


socket编程的最简单实例

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/socket.h>

#include <netinet/in.h>


//=============================================================

//=============================================================

int main(int argc, char *argv[])

{



{


port = atoi(argv[1]);


}


printf("TCP Server Started at port %d!\n", port);


sockfd = socket(AF_INET, SOCK_STREAM, 0);


if(sockfd < 0)


{


perror("Invalid socket");


exit(1);


}

初始化服务器地址


servAddr.sin_family = AF_INET;


servAddr.sin_port = htons(port);


servAddr.sin_addr.s_addr = htonl(INADDR_ANY);


printf("Binding server to port %d\n", port);


if(bind(sockfd, (struct sockaddr*)&servAddr, sizeof(struct sockaddr)) != 0)


{


close(sockfd);


perror("binding err!");


exit(1);


}


if(listen(sockfd, 1) != 0)


{


close(sockfd);


perror("listen err!");


exit(1);


}


printf("waiting client...\n");


while(1)


{



size_t recvLen;


size_t cliAddrLen = sizeof(cliAddr);


int connfd = accept(sockfd, (struct sockaddr*)&cliAddr, &cliAddrLen);


if(connfd < 0)


{


close(sockfd);


perror("accept err!");


exit(1);


}


inet_ntop(AF_INET, &cliAddr.sin_addr.s_addr, cliIP, INET_ADDRSTRLEN);


printf("client ip = %s\n", cliIP);


while((recvLen = read(connfd, recvbuf, 2048)) > 0)


{


write(connfd, recvbuf, recvLen);


}


close(connfd);


printf("client closed!\n");


}


close(sockfd);


return 0;

}


分析:

服务器:

unsigned short port = 8000;

定义端口号为8000

int sockfd;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

要加上一个错误判断,如果socket返回值小于0,就是错误的


struct sockaddr_in servAddr;

bzero(&servAddr, sizeof(servAddr));

定义了服务器地址结构体,并初始化,bzero相当于memset,将结构体内容清0


给服务器地址赋值:

端口号,注意要把port转换为(16位)网络字节序

servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址,用INADDR_ANY指定为任意IP,转换成(32位)网络字节序


bind(sockfd, (struct sockaddr*)&servAddr, sizeof(struct sockaddr))

绑定地址,要把服务器地址强制转换成sockaddr的结构体,同样加错误判断


listen(sockfd, 1)

开始监听,队列大小为1,只允许一个客户端访问,但实际在linux下不起作用


客户端:

char cliIP[INET_ADDRSTRLEN];

定义一个存放客户端IP地址的数组,大小为16


struct sockaddr_in cliAddr;

定义了客户端地址结构体


int connfd

connfd = accept(sockfd, (struct sockaddr*)&cliAddr, &cliAddrLen);

客户端连接到服务器,获得一个已经建立的连接connfd,这个就是当前连接,对它进行读写操作


inet_ntop(AF_INET, &cliAddr.sin_addr.s_addr, cliIP, INET_ADDRSTRLEN);

将客户端的IP地址转换成字符串,存放在cliIP中,INET_ADDSTRLEN指定大小为16


到这为止,连接已经建立完成,运行程序,用telnet登录服务器,输入服务器IP和端口号,连接成功,

就可以用read,write,读写connfd,实现通信。

GMT+8, 2011-5-14 16:43, Processed in 0.050082 second(s), 9 queries.

Powered by Discuz! 7.2

© 2001-2009 Comsenz Inc.



智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告