一个简单的接收网络数据程序
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。
源代码:
#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。
源代码:
相关文章推荐
- 一个简单的socket服务端和客户端程序:客户端发送数据给服务端,服务端接收到数据后再给客户端发送数据
- 一个简单的串口接收数据程序
- 本程序说明了如何建立一个简单的可以接收UDP服务器数据的UDP客户端
- 一个简单程序思考计算机里int数据的存储问题,兼论大端模式和小端模式
- 一个简单的Android Native(C/C++)网络数据加密方案
- 一个基于UDP数据广播的局域网络会议程序
- 一个简单的数据收集程序
- 使用UDP协议编写一个网络程序,设置接收端程序的监听端口是8001,发送端发送的数据是“Hello, world”
- c#入门:简单的数组,编写一个程序,接收每件商品的价格,计算应付的总金额并输出
- 基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗?
- 一个基于UDP数据广播的局域网络会议程序
- 编写一个聊天程序:有接收数据部分,和发数据的部分, 这两部分需要同时执行,使用多线程实现,一个控制接收,一个控制发送
- lesson 11:使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello, world”,客户端收到数据后打印输出。
- 网络编程与多线程的应用--基于socket udp编写一个简单聊天程序
- 今天遇到一个问题:在程序中加入的定时触发器,当时出现这样一个问题,触发器定时2秒,程序从后台查询数据经过复杂处理后时间超过了2秒,我查阅好些网络上说有可能触发器等待程序执行完毕后,在触发下一次,也有说
- [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
- 基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗?
- 本程序说明了如何建立一个可以接收UDP客户端数据的UDP 服务器
- 编写简单一个程序 将一个长整型数据 写入字节数组中,在从字节数组中读出来
- udp网络程序-发送、接收数据