Добрый вечер всем, Для ударов и хихиканья Я пробую свою руку в * 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);
}
Попробуйте заменить его с 'если ((привязка (носка (структура SOCKADDR *) s_, SizeOf (STRUCT sockaddr_in))) == -1) {'. Кроме того, нет необходимости бросать размер в socklen_t. – alvits