linux下socket编程,connect函数出现段错误,求解。

tingjingwaiting 2010-07-21 08:37:40
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<iostream>
#include<vector>
using namespace std;

#define PORT 6000

#define MAXDATASIZE 100

int sockfd,bytenum;
char readbuf[MAXDATASIZE];
char writebuf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server;
char IP[20];

int main()
{

cout<<"请输入服务器IP:"<<endl;
cin>>IP;

if((he = gethostbyname(IP)) == NULL)
{
printf("gethostbyname() error\n");
exit(1);
}

if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("socket() error\n");
exit(1);
}

bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = *((struct in_addr *)he->h_addr);
if(connect(sockfd,(struct sockaddr*)&server,sizeof(server)) == -1)
{
printf("connect() error");
exit(1);
}

while(gets(writebuf)!=NULL)//sprintf(writebuf,"..........%s",buf);
{
send(sockfd,writebuf,MAXDATASIZE,0);
bytenum = recv(sockfd,readbuf,MAXDATASIZE,0);
if(bytenum == 0)
{
printf("Server terminated.\n");
}
else
{
readbuf[bytenum] = '\0';
printf("num = %d\n",bytenum);
printf("Server Message:%s\n",readbuf);
}
}

close(sockfd);
}

我先说明一下情况,以上代码是正常的,但是我把这段代码改写成一个子函数,修改处为:把main()改写为search_net(),其它代码都是直接复制的,然后把它加到另一个程序了(该程序就只有这一个子函数需要跟服务器连接 )。然后编译通过,但是运行的时候到了connect函数的时候,报段错误。单步调试错误信息为:No source available for "connect() at 0x805850a"
...全文
422 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SLSnake 2010-07-21
  • 打赏
  • 举报
回复
我把你这个函数放到我用VC6建的一个测试程序(c++ console 类型)中,测试没问题啊.
没linux虚拟机,悲哀...
你看看是不是你的服务器端口被占用了
再查查吧,我帮不了你了.期待高手来帮你解决吧
tingjingwaiting 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 slsnake 的回复:]

你还是把最新的工程帖出来吧,这样查错比较容易,放个正确的,确实不好搞
[/Quote]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<iostream>
#include<vector>
using namespace std;

#define PORT 6000

#define MAXDATASIZE 100

int sockfd,bytenum;
char readbuf[MAXDATASIZE];
char writebuf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server;
char IP[20];

int search_net()
{

cout<<"请输入服务器IP:"<<endl;
cin>>IP;


if((he = gethostbyname(IP)) == NULL)
{
printf("gethostbyname() error\n");
exit(1);
}

if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("socket() error\n");
exit(1);
}

bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = *((struct in_addr *)he->h_addr);

cout<<" sockfd"<<sockfd<<" server"<<(struct sockaddr*)&server<<" sizeof(server)"<<sizeof(server)<<endl;

if(connect(sockfd,(struct sockaddr*)&server,sizeof(server)) == -1)
{
printf("connect() error");
exit(1);
}

while(gets(writebuf)!=NULL)//sprintf(writebuf,"..........%s",buf);
{
send(sockfd,writebuf,MAXDATASIZE,0);
bytenum = recv(sockfd,readbuf,MAXDATASIZE,0);
if(bytenum == 0)
{
printf("Server terminated.\n");
}
else
{
readbuf[bytenum] = '\0';
printf("num = %d\n",bytenum);
printf("Server Message:%s\n",readbuf);
}
}

close(sockfd);
}
tingjingwaiting 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 slsnake 的回复:]

你还是把最新的工程帖出来吧,这样查错比较容易,放个正确的,确实不好搞
[/Quote]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<iostream>
#include<vector>
using namespace std;

#define PORT 6000

#define MAXDATASIZE 100

int sockfd,bytenum;
char readbuf[MAXDATASIZE];
char writebuf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server;
char IP[20];

int main()
{

cout<<"请输入服务器IP:"<<endl;
cin>>IP;


if((he = gethostbyname(IP)) == NULL)
{
printf("gethostbyname() error\n");
exit(1);
}

if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("socket() error\n");
exit(1);
}

bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = *((struct in_addr *)he->h_addr);

cout<<" sockfd"<<sockfd<<" server"<<(struct sockaddr*)&server<<" sizeof(server)"<<sizeof(server)<<endl;

if(connect(sockfd,(struct sockaddr*)&server,sizeof(server)) == -1)
{
printf("connect() error");
exit(1);
}

while(gets(writebuf)!=NULL)//sprintf(writebuf,"..........%s",buf);
{
send(sockfd,writebuf,MAXDATASIZE,0);
bytenum = recv(sockfd,readbuf,MAXDATASIZE,0);
if(bytenum == 0)
{
printf("Server terminated.\n");
}
else
{
readbuf[bytenum] = '\0';
printf("num = %d\n",bytenum);
printf("Server Message:%s\n",readbuf);
}
}

close(sockfd);
}
SLSnake 2010-07-21
  • 打赏
  • 举报
回复
你还是把最新的工程帖出来吧,这样查错比较容易,放个正确的,确实不好搞
cnlm2 2010-07-21
  • 打赏
  • 举报
回复
我搞错了,不好意思!!
太乙 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 tingjingwaiting 的回复:]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include……
[/Quote]

lz
最好还是把新工程贴出来看看。。。拿一个正确的程序让别人找错误,太难为人了。。
cnlm2 2010-07-21
  • 打赏
  • 举报
回复
你的代码是网上copy的吧

if((he = gethostbyname(IP)) == NULL)
{
printf("gethostbyname() error\n");
exit(1);
}
这句有问题

改成下面这样就可以了
he = gethostbyname(IP);
if (NULL == he)
{
printf("gethostbyname() error\n");
exit(1);
}
tingjingwaiting 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 slsnake 的回复:]

你把函数外面定义的那些变量,放到函数里面然后再试试
在connect之前,把要用的参数都打印出来看看对不对
多加点打印信息,可以明显地看出哪里出的问题
[/Quote]

printf("connect() error");
这句代码没有执行
错误是在进入connect函数的时候出错的
我把参数打印出来,是正确的。
变量位置调整之后情况一样
SLSnake 2010-07-21
  • 打赏
  • 举报
回复
你把函数外面定义的那些变量,放到函数里面然后再试试
在connect之前,把要用的参数都打印出来看看对不对
多加点打印信息,可以明显地看出哪里出的问题
algorithms_memo 2010-07-21
  • 打赏
  • 举报
回复
说实在的,没错。。我直接拷贝编译、运行(更改了cout中文为英文,因为我远程linux没安装中文包),一切正常。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<iostream>
#include<vector>
using namespace std;

#define PORT 80

#define MAXDATASIZE 100

int sockfd,bytenum;
char readbuf[MAXDATASIZE];
char writebuf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server;
char IP[20];

int main()
{

cout<<"Inut ip:";
cin>>IP;

if((he = gethostbyname(IP)) == NULL)
{
printf("gethostbyname() error\n");
exit(1);
}

if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("socket() error\n");
exit(1);
}

bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = *((struct in_addr *)he->h_addr);
if(connect(sockfd,(struct sockaddr*)&server,sizeof(server)) == -1)
{
printf("connect() error");
exit(1);
}

while(gets(writebuf)!=NULL)//sprintf(writebuf,"..........%s",buf);
{
send(sockfd,writebuf,MAXDATASIZE,0);
bytenum = recv(sockfd,readbuf,MAXDATASIZE,0);
if(bytenum == 0)
{
printf("Server terminated.\n");
}
else
{
readbuf[bytenum] = '\0';
printf("num = %d\n",bytenum);
printf("Server Message:%s\n",readbuf);
}
}

close(sockfd);
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧