如何回传生成的socket??

superrg 2004-08-19 03:46:47
socket(AF_INET,SOCK_STREAM,0)创建一个socket对象,想把生成的对象传出,但没有成功,请问应该如何实现?

原函数如下:
bool tcpsocket(int *fd)
{
return ((*fd = socket(AF_INET,SOCK_STREAM,0)) >= 0);
}

结果发现fd的指针已改变,外面无法访问。。。
...全文
109 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
blankman 2004-08-19
  • 打赏
  • 举报
回复
强! pacman2000(pacman)(影子传说)

我们都局限在一个小圈子里了
再说就一条语句划得来写一个函数吗?函数调用、参数压栈出栈都是要花费时间得
pacman2000 2004-08-19
  • 打赏
  • 举报
回复
直接当int返回啊。
blankman 2004-08-19
  • 打赏
  • 举报
回复
我把你的代码简化了一下,跟踪没有发生异常变化
参考一下下面的方法吧,出去一下,一会儿回来看

我以前用delphi的时候出现过类似莫名其妙的错误,
你把几条无关的语句调换一下位置,删掉所有目标文件
重新编译一下,也许会解决这个问题,
我先看测试一下这个语句


#include <sys/socket.h>
#include <sys/socket.h>

bool tcpsocket(int *fd)
{
return ((*fd = socket(AF_INET,SOCK_STREAM,0)) >= 0);
}

bool createserver(char *IP, int port,int *listen_socket)
{

if (!tcpsocket(listen_socket))
{
return false;
}
//到此处listen_socket被修改,导致内存无法访问

return true;
}

int main(void)
{
int fd = 0;
createserver("i[", 10000, &fd);
return 0;
}
superrg 2004-08-19
  • 打赏
  • 举报
回复
to blankman(菜鸟):
我用gdb跟踪进createserver函数中,发现

if (!tcpsocket(listen_socket))
{
return false;
}
//到此处listen_socket指针指向被修改,导致内存无法访问

以致后面调用tcpbind时,listen_socket无效。。。

blankman 2004-08-19
  • 打赏
  • 举报
回复
或者这样return (((*fd) = socket(AF_INET,SOCK_STREAM,0)) >= 0);

但是 * 的优先级比 = 要高啊,没道理啊
blankman 2004-08-19
  • 打赏
  • 举报
回复
very very sorry!看错了,
应该没有什么问题啊
是 listen_socket 的值被修改了吗?

我以前用delphi的时候出现过类似莫名其妙的错误,
你把几条无关的语句调换一下位置,删掉所有目标文件
重新编译一下,也许会解决这个问题,
我先看测试一下这个语句
blankman 2004-08-19
  • 打赏
  • 举报
回复
首先,单从程序语法的方面来看,bool tcpsocket(int *fd)这样定义
的函数调用的时候应该传入指针或者指针类型的变量,而不是一个结构类型
的变量;
其次,结构类型是不能直接赋值的,不知道你是怎么成功的;
最后,socket()返回的是一个int类型的叫做“文件描述符”的东西,
而不是一个结构类型的变量,其他函数使用的也有问题,建议看一下相关的
知识,增强对socket和socket系列函数的理解

http://www.fanqiang.com/a4/b7/20010508/111655.html

调用的时候应该是这样的

int socketfd = 0;

....
if (!tcpsocket(&socketfd))
{
return false;
}

....
superrg 2004-08-19
  • 打赏
  • 举报
回复
外面是这样写的:

int listensocket;
if (!createserver(NULL,1080,&listensocket))
{
printf("create test server error!\n");
return;
}

blankman 2004-08-19
  • 打赏
  • 举报
回复
指针怎么会改变呢???
应该是指针的内容改变了才对啊 *fd 改变了
产生的 socket 的号码直接就可以从 *fd 返回了啊,
因为修改的是传进来的内存区域

外面你怎么写的?
是不是
......
int sfd;

tcpsocket(&sfd);
superrg 2004-08-19
  • 打赏
  • 举报
回复
是这个意思:
我封装了一个创建server的子函数,定义如下:
bool createserver(char *IP, int port,int *listen_socket)
{
struct sockaddr_in listen_addr;
if (!tcpsocket(listen_socket))
{
return false;
}
//到此处listen_socket被修改,导致内存无法访问
if (!bindaddr(&listen_addr,IP,port))
{
return false;
}

if (!tcpbind(listen_socket,&listen_addr))
{
return false;
}
return true;
}

我是想通过createserver能按传址方式返回socket

铖邑 2004-08-19
  • 打赏
  • 举报
回复
什么意思?当然可以返回了。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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