你好,我有一个关于套接字的问题 [英] hello i have a question about socket
本文介绍了你好,我有一个关于套接字的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想计算出UNIX Network Programming Volume 1中的练习7.1;但是当我打印UDP的发送和接收缓冲区时,错误是"getsockopt错误;协议不可用"
非常感谢.
代码是:
I want to work out the Exercises 7.1 in UNIX Network Programming Volume 1; but when I print the send and receive buffer of UDP, the error is "getsockopt error; Protocol not available"
Thank you very much.
the code is:
#include "unp.h"
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include "error.c"
union val
{
int i_val;
long l_val;
struct linger linger_val;
struct timeval timeval_val;
}val;
static char* sock_str_flag(union val*, int);
static char* sock_str_int(union val*, int);
static char* sock_str_linger(union val*, int);
static char* sock_str_timeval(union val*, int);
struct sock_opts
{
const char* opt_str;
int opt_level;
int opt_name;
char *(*opt_val_str)(union val*, int);
}sock_opts[] = {
{"SO_RCVBUF", IPPROTO_TCP, SO_RCVBUF, sock_str_int},
{"SO_SNDBUF", IPPROTO_TCP, SO_SNDBUF, sock_str_int},
{"SO_RCVBUF", IPPROTO_UDP, SO_RCVBUF, sock_str_int},
{"SO_SNDBUF", IPPROTO_UDP, SO_SNDBUF, sock_str_int},
{NULL, 0, 0, NULL}
};
int main(int argc, char** argv)
{
int fd;
socklen_t len;
struct sock_opts *ptr;
for(ptr = sock_opts; ptr->opt_str != NULL; ptr++)
{
if(ptr->opt_str != NULL)
printf("the printf is %s: \n", ptr->opt_str);
else
printf("NULL\n");
if(ptr->opt_val_str == NULL)
printf("(undefined)\n");
else
{
switch(ptr->opt_level)
{
case IPPROTO_TCP:
fd = socket(AF_INET, SOCK_STREAM, 0);
break;
case IPPROTO_UDP:
fd = socket(AF_INET, SOCK_DGRAM, 0);
printf("udp fd is %d\n", fd);
break;
default:
err_quit("can''t create fd for level %d\n", ptr->opt_level);
}
}
len = sizeof(val);
if(getsockopt(fd, ptr->opt_level, ptr->opt_name, &val, &len) == -1)
{
err_ret("getsockopt error");
}
else
printf("default = %s \n", (*ptr->opt_val_str)(&val, len));
close(fd);
}
exit(0);
}
static char strres[128];
static char* sock_str_int(union val* ptr, int len)
{
if(len != sizeof(int))
snprintf(strres, sizeof(strres), "size (%d) is not int", len);
else
snprintf(strres, sizeof(strres), "%d", ptr->i_val);
return strres;
}
推荐答案
Linux不是Unix.他们很接近,但是会有所不同.试试这个网站:
Linux套接字编程教程 [ ^ ]
Linux isn''t Unix. They''re close, but there will be differences. Try this web site:
Linux Socket programming tutorials[^]
SO_SENDBUF和SO_RECVBUF的套接字级别是SOL_SOCKET,而不是IPPROTO_TCP或IPPROTO_UDP.发送和接收缓冲区套接字选项在getsockopt和setsockopt中的套接字级别进行处理.在此处查看 [
The socket level for SO_SENDBUF and SO_RECVBUF is SOL_SOCKET not IPPROTO_TCP or IPPROTO_UDP. The send and receive buffer socket options are handled a socket level in getsockopt and setsockopt. Check here[^] for more information.
这篇关于你好,我有一个关于套接字的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文