您的位置:首页 > 理论基础 > 计算机网络

一个简单的接收网络数据程序

2008-12-04 21:21 429 查看
#include <stdio.h>

#include <stdlib.h>

#include <memory.h>

#include <string.h>

#include <time.h>

#include <errno.h>

#include <assert.h>

#include <sys/time.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <assert.h>

#define SOCKET_ERROR -1

#define INVALID_SOCKET -1

int CreateListeningSocket(const char* ip, unsigned short port, int* err_code)

{

int on = 1;

int ret = 0;

int sockfd;

struct sockaddr_in sin;

if(ip != NULL)

{

sin.sin_addr.s_addr = inet_addr(ip);

assert(sin.sin_addr.s_addr != INADDR_NONE);

}

else

{

sin.sin_addr.s_addr = htonl(INADDR_ANY);

}

sin.sin_family = AF_INET;

sin.sin_port = htons(port);

if( (sockfd=socket(AF_INET,SOCK_STREAM,0)) != SOCKET_ERROR &&

(ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on))) != SOCKET_ERROR &&

(ret = bind(sockfd,(struct sockaddr *)&sin,sizeof(sin))) != SOCKET_ERROR &&

(ret = listen(sockfd, 5)) != SOCKET_ERROR)

{

return sockfd;

}

if(ret == SOCKET_ERROR)

{

*err_code = errno;

if(sockfd != SOCKET_ERROR)

{

close(sockfd);

sockfd = SOCKET_ERROR;

}

}

return sockfd;

}

static void handle_client(int cs, const socdaddr_in* sinSrc)

{

char str[200];

int n;

n = ::recv(cs, str, sizeof(str), 0);

if (n == 0)

{

printf("socket closed/n");

}

else if(n < 0)

{

printf("recv error:%s/n", strerror(errno));

}

else

{ // get data

printf("recv:%s/n", str);

strcpy(str, "hello! I got it!");

::send(cs, str, strlen(str)+1,, 0);

}

}

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

{

DWORD err_code;

int s;

unsigned short port = 3000;

s = CreateListeningSocket(NULL, port, &err_code);

if(s == SOCKET_ERROR)

{

printf("CreateListeningSocket on port (%s:%u) failed->%s/n", inet_ntoa(sin.sin_addr), port, strerror(errno));

return -1;

}

//start looping server

while(1)

{

int cs;

sockaddr_in sinSrc;

socklen_t len = sizeof(sinSrc);

cs = accept(s, (struct sockaddr*)&sinSrc, &len);

if(cs < 0)

{

continue;

}

//handle cs

handle_client(cs, &sinSrc);

close(cs);

}

close(s);

return -1;

}

这是一个简单的测试程序。

平台:suse Linux 10

功能:简历TCP网络侦听端口,接收数据包

总结:

1.两个socket,一个是面向套接字,即socket的返回值;一个是面向连接套接字,accept之后的返回值。

2.有人说,同一台电脑上可以在同一个端口上建立多个套接字,比如3个进程都建立了套接字,bind了同一个端口,并且处在listen状态,网络数据过来时,只能有一个socket能收到数据,待验证。

3.只有接收了tcp连接后,才能确定对方的ip和port,即从accpet的入参中得到remote ip & remote tcp port。

源代码:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐