你好,我有一个关于套接字的问题 [英] hello i have a question about socket

查看:87
本文介绍了你好,我有一个关于套接字的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想计算出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, &amp;val, &amp;len) == -1)
        {
            err_ret("getsockopt error");
        }
        else
            printf("default = %s \n", (*ptr->opt_val_str)(&amp;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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆