當前位置:編程學習大全網 - 編程語言 - C語言UDP協議

C語言UDP協議

簡單的學習代碼,僅供參考:

server.c

#include?<stdlib.h>

#include?<stdio.h>

#include?<string.h>

#include?<netdb.h>

#include?<sys/socket.h>

#include?<arpa/inet.h>

#define?SERVICE_PORT 8080

#define?BUFSIZE?2048

#define?HEAD?4

int?main(int?argc,?char?**argv)

{

struct?sockaddr_in?myaddr; /*?our?address?*/

struct?sockaddr_in?remaddr; /*?remote?address?*/

socklen_t?addrlen?=?sizeof(remaddr); /*?length?of?addresses?*/

int?recvlen; /*?#?bytes?received?*/

int?fd; /*?our?socket?*/

int?msgcnt?=?0; /*?count?#?of?messages?we?received?*/

unsigned?char?buf[BUFSIZE]="ret_"; /*?receive?buffer?*/

/*?create?a?UDP?socket?*/

if?((fd?=?socket(AF_INET,?SOCK_DGRAM,?0))?<?0)?{

perror("cannot?create?socket\n");

return?0;

}

/*?bind?the?socket?to?any?valid?IP?address?and?a?specific?port?*/

memset((char?*)&myaddr,?0,?sizeof(myaddr));

myaddr.sin_family?=?AF_INET;

myaddr.sin_addr.s_addr?=?htonl(INADDR_ANY);

myaddr.sin_port?=?htons(SERVICE_PORT);

if?(bind(fd,?(struct?sockaddr?*)&myaddr,?sizeof(myaddr))?<?0)?{

perror("bind?failed");

return?0;

}

/*?now?loop,?receiving?data?and?printing?what?we?received?*/

for?(;;)?

{

printf("waiting?on?port?%d\n",?SERVICE_PORT);

recvlen?=?recvfrom(fd,?buf+HEAD,?BUFSIZE,?0,?(struct?sockaddr?*)&remaddr,?&addrlen);

if?(recvlen?>?0)?

{

buf[HEAD+recvlen]?=?0;

printf("received?message:?\"%s\"?(%d?bytes)\n",?buf+HEAD,?recvlen);

}

else

{

printf("uh?oh?-?something?went?wrong!\n");

}

printf("sending?response?\"%s\"\n",?buf);

if?(sendto(fd,?buf,?strlen(buf),?0,?(struct?sockaddr?*)&remaddr,?addrlen)?<?0)

{

perror("sendto");

}

}

close(fd);

return?0;

}

client.c

#include?<stdlib.h>

#include?<stdio.h>

#include?<string.h>

#include?<netdb.h>

#include?<sys/socket.h>

#define?SERVICE_PORT 8080

#define?BUFLEN?2048

int?main(?int?argc,char*?argv[]?)

{

struct?sockaddr_in?myaddr,?remaddr;

int?fd,?i,?slen=sizeof(remaddr);

char?sendbuf[BUFLEN]="hello"; /*?message?buffer?*/

char?readbuf[BUFLEN]={0};

int?recvlen; /*?#?bytes?in?acknowledgement?message?*/

char?*server?=?"127.0.0.1"; /*?change?this?to?use?a?different?server?*/

/*?create?a?socket?*/

if?((fd=socket(AF_INET,?SOCK_DGRAM,?0))==-1)

{

printf("socket?created\n");

}

/*?bind?it?to?all?local?addresses?and?pick?any?port?number?*/

memset((char?*)&myaddr,?0,?sizeof(myaddr));

myaddr.sin_family?=?AF_INET;

myaddr.sin_addr.s_addr?=?htonl(INADDR_ANY);

myaddr.sin_port?=?htons(0);

if?(bind(fd,?(struct?sockaddr?*)&myaddr,?sizeof(myaddr))?<?0)?

{

perror("bind?failed");

return?0;

}

memset((char?*)?&remaddr,?0,?sizeof(remaddr));

remaddr.sin_family?=?AF_INET;

remaddr.sin_port?=?htons(SERVICE_PORT);

if?(inet_aton(server,?&remaddr.sin_addr)==0)?

{

fprintf(stderr,?"inet_aton()?failed\n");

exit(1);

}

printf("Sending?packet?%d?to?%s?port?%d\n",?i,?server,?SERVICE_PORT);

if?(sendto(fd,?sendbuf,?strlen(sendbuf),?0,?(struct?sockaddr?*)&remaddr,?slen)==-1)

{

perror("sendto");

exit(1);

}

/*?now?receive?an?acknowledgement?from?the?server?*/

recvlen?=?recvfrom(fd,?readbuf,?BUFLEN,?0,?(struct?sockaddr?*)&remaddr,?&slen);

if?(?recvlen?>=?0?)?

{

readbuf[recvlen]?=?0; /*?expect?a?printable?string?-?terminate?it?*/

printf("received?message:?\"%s\"\n",?readbuf);

}

close(fd);

return?0;

}

如果需要整個工程,可以聯系我。

  • 上一篇:錢江摩托在哪生產
  • 下一篇:聯想t470輕薄筆記本電腦怎麽樣
  • copyright 2024編程學習大全網