[英]Get buffer from recvfrom
我正在嘗試編寫井字游戲通過UDP通信。 現在我有代碼:
int recv_txt(int sock, struct sockaddr_in *incoming_addr)
{
char bud[MAX_LENGTH];
unsigned int incoming_add_len;
incoming_add_len = sizeof(*incoming_addr);
if(recvfrom(sock, &buf, MAX_LENGTH, 0 (struct sockaddr*)incoming_addr, &incoming_addr_len) < 0)
{
return 0;
}
printf("received %s", buf);
return 1;
}
int main(int argv, char **argc)
{
/** some code to create socket etc */
struct sockaddr_in incoming_addr;
for(;;)
{
recv_txt(sock, &incoming_addr);
//here I would like to create new thread, which will process the buffer from recv_txt and send response;
}
}
現在我需要從recv_txt
獲取緩沖區,將其放入這樣的結構中:
struct M_s
{
struct sockaddr_in address;
char[MAX_LENGTH] buffer;
}
並將其傳遞給新線程。 但是我無法從recv_txt
獲取緩沖區。 我在C語言中還很陌生,現在我不能很好地使用指針。
感謝您的任何建議。
編輯
我嘗試了Frankie_c提供的解決方案,但是現在我對printf
有問題。 當我嘗試main
:
LP_ARGS_STRUCT args = recv_txt(sock)
printf("data from: %s", inet_ntoa(args->address.sin_adrr))
我沒有得到任何打印到控制台或收到錯誤消息。
EDIT2-完整代碼
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#define SRV_PORT 23456
#define MAX_TXT_LENGTH 1000
#define MAX_ROOMS 1
int sock;
typedef struct args_s
{
struct sockaddr_in address;
char buffer[MAX_TXT_LENGTH];
} ARGS_STRUCT, *LP_ARGS_STRUCT;
//typedef struct args_s args;
LP_ARGS_STRUCT recv_txt(int sock)
{
LP_ARGS_STRUCT args = malloc(sizeof(ARGS_STRUCT));
//memory error
if(!args)
{
return 1;
}
unsigned int incoming_addr_len = sizeof(args->address);
//incoming_addr_len = sizeof(*incoming_addr);
if (recvfrom(sock, &args->buffer, MAX_TXT_LENGTH, 0,
(struct sockaddr*)&args->address, &incoming_addr_len) < 0)
{
free(args);
return NULL;
}
printf("received: %s %s\n", args->buffer, inet_ntoa(args->address.sin_addr));
return 1;
}
int main(int argv, char **argc)
{
int i = 0;
int optval;
struct sockaddr_in addr, incoming_addr;
char buffer[MAX_TXT_LENGTH];
/* create socket */
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock < 0)
{
err("socket()");
}
/* set reusable flag */
optval = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
/* prepare inet address */
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(SRV_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY); /* listen on all interfaces */
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0)
{
err("bind");
}
for(;;)
{
LP_ARGS_STRUCT args = recv_txt(sock);
if(!args) continue;
printf("%s\n", args->buffer);
}
return 0;
}
在收到數據包后,我得到:
received: Hello 192.168.56.1
Segmentation fault (code dumped)
Process returned 139 (0x8B)
對於原始問題,請嘗試以下操作:
typedef struct M_s
{
struct sockaddr_in address;
char[MAX_LENGTH] buffer;
} M_STRUCT, *LP_M_STRUCT; //Create a typedef for struct
//Modify your function to return a structure pointer and having just socket as par...
LP_M_STRUCT recv_txt(int sock)
{
LP_M_STRUCT pMs = malloc(sizeof(M_STRUCT));
if (!pMs)
{
//Handle memory error here!
return NULL;
}
unsigned int incoming_add_len = sizeof(pMs->incoming_addr);
if (recvfrom(sock, &pMs->buffer, MAX_LENGTH, 0, (struct sockaddr *)&pMs->incoming_addr, &incoming_addr_len) < 0)
{
free(pMs); //Release memory
return NULL; //Return nothing...
}
//If we are here we were successfull.
//The structure pMs holds all data we need... so give it to caller...
printf("From %s received %s", inet_ntoa(pMs->address.sin_addr), pMs->buffer);
return pMs;
}
int main(int argv, char **argc)
{
/** some code to create socket etc */
for (;;)
{
LP_M_STRUCT pMs = recv_txt(sock);
if (!pMs) //Check if we get a sign of life on UDP...
continue; //No continue to wait for ...
//We print values again to check that it is ok...
printf("From %s received %s", inet_ntoa(pMs->address.sin_addr), pMs->buffer);
//here create new thread to process the buffer from recv_txt and send response;
//The new thread code have to release structure memory when done!!!
}
}
編輯:您的問題是, 成功時不返回分配的結構,失敗時不返回NULL 。 看到:
LP_ARGS_STRUCT recv_txt(int sock)
{
LP_ARGS_STRUCT args = malloc(sizeof(ARGS_STRUCT));
//memory error
if(!args)
{
//return 1; !!!WRONG!!!
return NULL;
}
unsigned int incoming_addr_len = sizeof(args->address);
//incoming_addr_len = sizeof(*incoming_addr);
if (recvfrom(sock, &args->buffer, MAX_TXT_LENGTH, 0,
(struct sockaddr*)&args->address, &incoming_addr_len) < 0)
{
free(args);
return NULL;
}
printf("received: %s %s\n", args->buffer, inet_ntoa(args->address.sin_addr));
//return 1; WRONG! You have to return the allocated struct
return args;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.