当前位置: 技术问答>linux和unix
为什么我的setsockopt调用会什失敗?
来源: 互联网 发布时间:2015-10-17
本文导语: 我在成功创建一个socket之后,调用setsockopt设置接收超时时间,但失败了 ,为什么,请高手指教(redhat 9操作系统),源代码如下: int ret; ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); ...
我在成功创建一个socket之后,调用setsockopt设置接收超时时间,但失败了 ,为什么,请高手指教(redhat 9操作系统),源代码如下:
int ret;
ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
if (ret == -1)
{
return FALSE;
}
return TRUE;
其中s是一个全局变量,大小由mysocket函数返回,调式过程中为8,timeout是我指定的,为200,调试中SOL_SOCKET的值为1,SO_RCVTIMEO的值为20.
mysocket函数如下:
int mysocket(int af, int type, int protocol)
{
int s;
if ((s = socket(af, type, protocol)) == -1)
{
printf("Create Socket Failedn");
return -1;
}
else
{
printf("Create Socket succeed!n");
}
return s;
}
我是这样调用mysocket函数的
if ((s = mysocket(AF_INET, SOCK_STREAM, 0)) == -1)
{
return FALSE;
}
int ret;
ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
if (ret == -1)
{
return FALSE;
}
return TRUE;
其中s是一个全局变量,大小由mysocket函数返回,调式过程中为8,timeout是我指定的,为200,调试中SOL_SOCKET的值为1,SO_RCVTIMEO的值为20.
mysocket函数如下:
int mysocket(int af, int type, int protocol)
{
int s;
if ((s = socket(af, type, protocol)) == -1)
{
printf("Create Socket Failedn");
return -1;
}
else
{
printf("Create Socket succeed!n");
}
return s;
}
我是这样调用mysocket函数的
if ((s = mysocket(AF_INET, SOCK_STREAM, 0)) == -1)
{
return FALSE;
}
|
这个在我机器上能行。
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in saddr;
struct timeval timeout = {
.tv_sec = 0,
.tv_usec = 200,
};
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) == -1) {
perror("setsockopt");
exit(1);
}
memset(&saddr, 0, sizeof(struct sockaddr_in));
saddr.sin_port=htons(9999);
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=inet_addr("192.168.1.10");
if (connect(sockfd, (struct sockaddr*)&saddr, sizeof(saddr)) == -1) {
perror("connect");
exit(1);
}
exit(0);
}
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in saddr;
struct timeval timeout = {
.tv_sec = 0,
.tv_usec = 200,
};
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) == -1) {
perror("setsockopt");
exit(1);
}
memset(&saddr, 0, sizeof(struct sockaddr_in));
saddr.sin_port=htons(9999);
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=inet_addr("192.168.1.10");
if (connect(sockfd, (struct sockaddr*)&saddr, sizeof(saddr)) == -1) {
perror("connect");
exit(1);
}
exit(0);
}
|
调用后,如失败使用perror("Error:")看看出什么信息
当然要#include
当然要#include
|
绝大多数情况用#include 就行了,最好不要直接用linux/下的头文件。
|
可能有些是系统用到的,有些是应用程序用到的
|
楼主,你可以用man查Linux的用户手册啊,哪个函数的申明在哪个头文件中以及setsockopt返回错误等等这些信息都可以查到。这可是学习linux最主要的手段啊,你不会不知道吧?