2015-04-23 1 views
0

Добрый вечер всем, Для ударов и хихиканья Я пробую свою руку в * NIX-сокетах и ​​TCP/IP. Теперь, чтобы сойти с земли, я просто пытаюсь создать сокет на двух конечных точках и базовую программу текстового чата взад и вперед. Теперь, прежде чем я даже и работает, я ударил с безвыходном «недопустимый аргумент»:socket not bind() ing - Неверный аргумент

[email protected]:~/sockets$ ./socket 
sock=3 
s_->sin_family = 2 
s_->sin_port = 3879 
s_->sin_addr.s_addr = 0 
sockfd = 3 
s_->sin_family = 2 
s_->sin_port = 3879 
s_->sin_addr.s_addr = 0 
Socket bind error: Invalid argument 
sizeof(s_) = 8 

код ниже. поэтому, INADDR_ANY должно быть 255.255.225.255 = 0, из того, что я понимаю; AF_INET равно 2; и sin_port, ну, я посмотрел на двоичный код назад и вперед и не уверен, что понимаю, как 9000 представлено в хост-порядке на 3879 с 9000, но предположим, что это не проблема. Кроме того, поскольку 1 является stdout и 2 является stderr, я предполагаю, что что-то выше этого динамически распределено и поэтому 3 должно быть хорошо для дескриптора файла сокета.

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <string.h> 
#include <errno.h> 
void setSocket(struct sockaddr_in* s_){ 
    s_->sin_family=AF_INET; 
    s_->sin_port=htons(9999); 
    s_->sin_addr.s_addr=INADDR_ANY; 
    memset(&(s_->sin_zero), '\0', 8); 
    printf("s_->sin_family = %i\n", s_->sin_family);  
    printf("s_->sin_port = %i\n", s_->sin_port); 
    printf("s_->sin_addr.s_addr= %i\n", s_->sin_addr.s_addr); 
} 

void createSocket(int *sock){ 
    if ((*sock = socket(AF_INET, SOCK_STREAM, 0)) == -1){ 
     fprintf(stderr, "Socket creation error: %s\n", strerror(errno)); 
     exit(1); 
    } 
    printf("sock = %i\n", *sock); 
    fflush(stdout); 
} 

void bindSocket(int sock, struct sockaddr_in* s_){ 
    printf("s_->sin_family = %i\n",s_->sin_family); 
    printf("s_->sin_port = %i\n",s_->sin_port); 
    printf("s_->sin_addr.s_addr = %i\n",s_->sin_addr.s_addr); 
    if((bind(sock, (struct sockaddr*)s_, (socklen_t)sizeof(s_))) == -1){ 
     fprintf(stderr, "Socket bind error: %s\n", strerror(errno)); 
    } 
    printf("sizeof(s_) = %lu\n", sizeof(s_)); 
} 

int main(int argc, char* argv[]){ 
    int sockfd; 
    struct sockaddr_in socket_; 
    createSocket(&sockfd); 
    setSocket(&socket_); 
    printf("sockfd = %i\n", sockfd); 
    fflush(stdout); 
    bindSocket(sockfd, &socket_); 
    exit(0); 
} 
+0

Попробуйте заменить его с 'если ((привязка (носка (структура SOCKADDR *) s_, SizeOf (STRUCT sockaddr_in))) == -1) {'. Кроме того, нет необходимости бросать размер в socklen_t. – alvits

ответ

0

Я считаю, что проблема заключается в

SizeOf() внутри связывания() ... 's_' является указателем, поэтому его SizeOf это (возможно) 4 ... Вы должны разыменовать ему:

if((bind(sock, (struct sockaddr*)s_, (socklen_t)sizeof(*s_))) == -1){ 
    fprintf(stderr, "Socket bind error: %s\n", strerror(errno)); 
} 
+0

Это имеет смысл для меня, НО, когда я меняю это, он бросает массу ошибок при попытке скомпилировать через gcc. Я могу опубликовать их, но они довольно горстки и «слишком длинны 4950 символов»; дайте мне знать, будет ли это лучше всего в новом вопросе. – patricio2626

+0

Когда я компилирую с gcc на ubuntu 14.04LTS, я получаю только следующее предупреждение: sock.c: В функции 'bindSocket': sock.c: 33: 5: warning: format '% lu' ожидает аргумент типа 'long unsigned int ', но аргумент 2 имеет тип' unsigned int '[-Wformat =] printf ("sizeof (s_) =% lu \ n", sizeof (s_)); ^ Единственное изменение, которое я внес в код, который вы отправили, - это добавление звездочки (*). – TonyB

+0

Да, у меня такая же настройка. Я буду играть с этой новой проблемой, но я думаю, что первоначальная жалоба теперь позади меня. Спасибо! – patricio2626

Смежные вопросы