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