C - udp send and receive in one socket

I would like to send and receive packets on the same socket, is this possible or do I need to create two sockets, one for sending and one for receiving? If so, can you give me an example?

Another question: how can I get the source ip from the received packet?

EDIT (sample code):

int main(void) { struct sockaddr_in si_me, si_other; int s, i, slen=sizeof(si_other); char buf[BUFLEN]; if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) die("socket"); memset((char *) &si_me, 0, sizeof(si_me)); si_me.sin_family = AF_INET; si_me.sin_port = htons(1234); si_me.sin_addr.s_addr = htonl(192.168.1.1); if (bind(s, &si_me, sizeof(si_me))==-1) die("bind"); if (recvfrom(s, buf, BUFLEN, 0, &si_other, &slen)==-1) diep("recvfrom()"); printf("Data: %s \nReceived from %s:%d\n\n", buf, inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port)); //now I want the server to answer back to the client close(s); return 0; } 
+6
source share
1 answer

Yes, you can use the same socket to send and receive. recvfrom() reports the sender's IP / port. Just sendto() that the IP / port uses the same socket that you use with recvfrom() , for example:

 int main(void) { struct sockaddr_in si_me, si_other; int s, i, blen, slen = sizeof(si_other); char buf[BUFLEN]; s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == -1) die("socket"); memset((char *) &si_me, 0, sizeof(si_me)); si_me.sin_family = AF_INET; si_me.sin_port = htons(1234); si_me.sin_addr.s_addr = htonl(192.168.1.1); if (bind(s, (struct sockaddr*) &si_me, sizeof(si_me))==-1) die("bind"); int blen = recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr*) &si_other, &slen); if (blen == -1) diep("recvfrom()"); printf("Data: %.*s \nReceived from %s:%d\n\n", blen, buf, inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port)); //send answer back to the client if (sendto(s, buf, blen, 0, (struct sockaddr*) &si_other, slen) == -1) diep("sendto()"); close(s); return 0; } 
+12
source

Source: https://habr.com/ru/post/969480/


All Articles