当前位置: 技术问答>linux和unix
guosha fuqd273 以及各位高人能否进来下?
来源: 互联网 发布时间:2016-04-04
本文导语: 各位老师请帮我看一下 下面是我参阅了网上一些资料写的一个程序,目的是用来处理单服务器与多客户端实时收发报文,服务器端对报文解析处理。但觉得比之accept阻塞加多进程没有太大的优势,反而有很多...
各位老师请帮我看一下
下面是我参阅了网上一些资料写的一个程序,目的是用来处理单服务器与多客户端实时收发报文,服务器端对报文解析处理。但觉得比之accept阻塞加多进程没有太大的优势,反而有很多的硬伤:
源代码:
Server端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_NUM 10
int
create_socket( char* _ip, int _port )
{
int sockfd;
int backlog = 5;
int opt;
socklen_t opt_len;
struct sockaddr_in svr_addr;
struct hostent *host;
struct in_addr in_ip;
opt = 1;
opt_len = sizeof(int);
if ( -1 == ( sockfd=socket( AF_INET, SOCK_STREAM, 0 ) ) ) {
printf( "Socket() error!原因:[%d]%sn", errno, strerror(errno) );
return -1;
}
setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, opt_len );
bzero( &svr_addr, sizeof(svr_addr) );
svr_addr.sin_family = AF_INET;
svr_addr.sin_port = htons( _port );
svr_addr.sin_addr.s_addr = htonl( INADDR_ANY );
bzero( &(svr_addr.sin_zero), 8 );
if ( -1 == ( bind( sockfd, (struct sockaddr *)(&svr_addr), sizeof( svr_addr ) ) ) ) {
printf( "Bind() error!原因:[%d]%sn", errno, strerror(errno) );
return -1;
}
if ( -1 == ( listen( sockfd, backlog ) ) ) {
printf( "Listen() error!原因:[%d]%sn", errno, strerror(errno) );
return -1;
}
printf( "服务器监听已启动:[hostname:%s] [PORT:%d]n", getenv("HOSTNAME"), _port );
return sockfd;
}
int
main()
{
int retval;
int clisock_set[5];
int svrsock, clisock;
fd_set readfd, rfds;
char buf[1024];
struct sockaddr_in svr_addr, cli_addr;
struct timeval timeout;
int cnt = 1;
int ii;
int maxfd = -1;
int port_num = 11111;
char ip_str[] = "localhost";
int addr_len = sizeof(cli_addr);
svrsock = create_socket( ip_str, port_num );
if ( svrsock == -1 ) {
perror( "create_socket()" );
exit(-1);
}
for ( ii = 0; ii
下面是我参阅了网上一些资料写的一个程序,目的是用来处理单服务器与多客户端实时收发报文,服务器端对报文解析处理。但觉得比之accept阻塞加多进程没有太大的优势,反而有很多的硬伤:
源代码:
Server端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_NUM 10
int
create_socket( char* _ip, int _port )
{
int sockfd;
int backlog = 5;
int opt;
socklen_t opt_len;
struct sockaddr_in svr_addr;
struct hostent *host;
struct in_addr in_ip;
opt = 1;
opt_len = sizeof(int);
if ( -1 == ( sockfd=socket( AF_INET, SOCK_STREAM, 0 ) ) ) {
printf( "Socket() error!原因:[%d]%sn", errno, strerror(errno) );
return -1;
}
setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, opt_len );
bzero( &svr_addr, sizeof(svr_addr) );
svr_addr.sin_family = AF_INET;
svr_addr.sin_port = htons( _port );
svr_addr.sin_addr.s_addr = htonl( INADDR_ANY );
bzero( &(svr_addr.sin_zero), 8 );
if ( -1 == ( bind( sockfd, (struct sockaddr *)(&svr_addr), sizeof( svr_addr ) ) ) ) {
printf( "Bind() error!原因:[%d]%sn", errno, strerror(errno) );
return -1;
}
if ( -1 == ( listen( sockfd, backlog ) ) ) {
printf( "Listen() error!原因:[%d]%sn", errno, strerror(errno) );
return -1;
}
printf( "服务器监听已启动:[hostname:%s] [PORT:%d]n", getenv("HOSTNAME"), _port );
return sockfd;
}
int
main()
{
int retval;
int clisock_set[5];
int svrsock, clisock;
fd_set readfd, rfds;
char buf[1024];
struct sockaddr_in svr_addr, cli_addr;
struct timeval timeout;
int cnt = 1;
int ii;
int maxfd = -1;
int port_num = 11111;
char ip_str[] = "localhost";
int addr_len = sizeof(cli_addr);
svrsock = create_socket( ip_str, port_num );
if ( svrsock == -1 ) {
perror( "create_socket()" );
exit(-1);
}
for ( ii = 0; ii
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
站内导航:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!