我想以非常簡單/基本的方式在C中實現UDP套接字。我的程序是爲了在終端之間發送/接收文件,每個程序運行一個程序。我在客戶端代碼中遇到了sendto()
函數的問題。這裏是我的代碼:C - Sendto()中的UDP套接字發送失敗:無效參數
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include <errno.h>
#define BUFFER_SIZE 512
int main(int argc, char *argv[])
{
struct sockaddr_in client;
int sockfd, bytes, errno, slen = sizeof(client);
char buffer[BUFFER_SIZE];
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd == -1)
{
perror("Socket creation failed.");
return 0;
}
client.sin_addr.s_addr = INADDR_ANY;
client.sin_family = AF_INET;
client.sin_port = htons(0);
if(bind(sockfd, (struct sockaddr *)&client, sizeof(client)) == -1)
{
perror("Bind call failed.");
return 0;
}
while(1)
{
printf("Enter message : ");
fgets(buffer, BUFFER_SIZE, stdin);
printf("Message: %s\n", buffer);
bytes = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&client, sizeof(client));
printf("Bytes: %d\n", bytes);
if(bytes == -1)
{
printf("Error number: %d", errno);
perror("Send failed.");
return 0;
}
memset(buffer,'\0', BUFFER_SIZE);
if(recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&client, &slen) == -1)
{
perror("Recieve failed.");
return 0;
}
puts(buffer);
}
close(sockfd);
return 0;
}
無論我進入緩衝區,我總是從sendto()中得到錯誤號碼22爲無效參數。我已經嘗試了我遇到的每個解決方案或調整,但似乎沒有任何工作。
您正在嘗試發送到端口0,這是無效的。 – Barmar
你爲什麼想要發送到客戶地址?如果這是客戶端代碼,它應該發送到服務器的地址。 – Barmar
如果端口無效,綁定也會失敗嗎?如果我嘗試將端口設置爲與服務器相同的端口,它將無法運行,因爲服務器已在使用該端口並且綁定失敗。另外,因爲它只是在本地主機上發送,我相信兩個地址是相同的?我可能是錯的。我是新來的socket – bibzuda7