当前位置: 技术问答>linux和unix
大家帮我看一个socket编程的问题,高分奉送
来源: 互联网 发布时间:2014-12-22
本文导语: 为什么不能为套接口绑定地址 bind函数好像不起作用啊,急 #include #include #include #include #include #include #include #include #include static void bail(const char *on_what) { fputs(on_what, stderr); fputs("n", stderr); exit...
为什么不能为套接口绑定地址
bind函数好像不起作用啊,急
#include
#include
#include
#include
#include
#include
#include
#include
#include
static void bail(const char *on_what)
{
fputs(on_what, stderr);
fputs("n", stderr);
exit(1);
}
int main(int argc, char** argv)
{
int z;
struct sockaddr_in adr_inet;
int len_inet;
int sck_inet;
sck_inet = socket(AF_INET, SOCK_STREAM, 0);
if(sck_inet == -1)
bail("sccket()");
memset(&adr_inet, 0, sizeof adr_inet);
adr_inet.sin_family = AF_INET;
adr_inet.sin_port = htons(9000);
if(!inet_aton("127.0.0.23", &adr_inet.sin_addr))
bail("bad address.");
len_inet = sizeof adr_inet;
z = bind(sck_inet, (struct sockaddr*)&adr_inet, len_inet);
if(z == -1)
bail("bind()");
system("netstat -pa --tcp 2>/dev/null|"
"sed -n '1,/^Proto/p;/bind/p'");
return 0;
}
bind函数好像不起作用啊,急
#include
#include
#include
#include
#include
#include
#include
#include
#include
static void bail(const char *on_what)
{
fputs(on_what, stderr);
fputs("n", stderr);
exit(1);
}
int main(int argc, char** argv)
{
int z;
struct sockaddr_in adr_inet;
int len_inet;
int sck_inet;
sck_inet = socket(AF_INET, SOCK_STREAM, 0);
if(sck_inet == -1)
bail("sccket()");
memset(&adr_inet, 0, sizeof adr_inet);
adr_inet.sin_family = AF_INET;
adr_inet.sin_port = htons(9000);
if(!inet_aton("127.0.0.23", &adr_inet.sin_addr))
bail("bad address.");
len_inet = sizeof adr_inet;
z = bind(sck_inet, (struct sockaddr*)&adr_inet, len_inet);
if(z == -1)
bail("bind()");
system("netstat -pa --tcp 2>/dev/null|"
"sed -n '1,/^Proto/p;/bind/p'");
return 0;
}
|
bind函数调用成功返回0,失败返回-1 并置errno.其失败的原因可能是指定的地址格式不正确或套接字已经捆绑有名字!!
如果,bind函数没有捕获错误,可能是根本就没有执行bind命令.你可以在程序前面设置跟踪,先看看bind前程序的执行情况.再说吧!!
如果,bind函数没有捕获错误,可能是根本就没有执行bind命令.你可以在程序前面设置跟踪,先看看bind前程序的执行情况.再说吧!!
|
1。你的主机有127.0.0.23这样的地址吗???
2。如果你不需要明确指定地址,那么只需这样设置
adr_inet.sin_addr=htonl(INADDR_ANY);
2。如果你不需要明确指定地址,那么只需这样设置
adr_inet.sin_addr=htonl(INADDR_ANY);
|
主要是bind的长度不对,应该是sizeof(struct sockaddr)
看一段
void *SocketServer(void *arg)
{
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in their_addr; /* 客户地址信息 */
int sockfd,new_fd; /* 监听socket: sock_fd,数据传输socket:new_fd*/
int i,sin_size=1;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /*错误检测 */
perror("socket");
return NULL;
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&sin_size,sizeof(int))==-1)/*地址可重用*/
{
perror("setsockopt");
return NULL;
}
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {/*错误检测*/
perror("bind");
return NULL;
}
if (listen(sockfd, MAXCONNECT) == -1) {/*错误检测*/
perror("listen");
return NULL;
}
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1) {
perror("accept");
return NULL;
}
printf("nserver: got connection from %sn",inet_ntoa(their_addr.sin_addr));
printf("server: new_fd= %dn",new_fd);
return NULL;
}
看一段
void *SocketServer(void *arg)
{
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in their_addr; /* 客户地址信息 */
int sockfd,new_fd; /* 监听socket: sock_fd,数据传输socket:new_fd*/
int i,sin_size=1;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /*错误检测 */
perror("socket");
return NULL;
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&sin_size,sizeof(int))==-1)/*地址可重用*/
{
perror("setsockopt");
return NULL;
}
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {/*错误检测*/
perror("bind");
return NULL;
}
if (listen(sockfd, MAXCONNECT) == -1) {/*错误检测*/
perror("listen");
return NULL;
}
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1) {
perror("accept");
return NULL;
}
printf("nserver: got connection from %sn",inet_ntoa(their_addr.sin_addr));
printf("server: new_fd= %dn",new_fd);
return NULL;
}