您的位置:首页 > 编程语言 > C语言/C++

【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯

2014-11-03 22:52 666 查看
本次实验利用UDP协议, 语言环境为 C/C++

利用套接字Socket编程,实现Server/CLient 之间简单的通讯。

结果应为类似所示:

/* UDPClient.cpp */

#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <time.h>

#define    BUFLEN        2000                  // 缓冲区大小
#define WSVERS        MAKEWORD(2, 2)        // 指明版本2.2
#pragma comment(lib,"ws2_32.lib")         // 加载winsock 2.2 Llibrary

void
main(int argc, char *argv[])
{
char    *host = "127.0.0.1";        /* server IP to connect         */

char    *service = "5050";          /* server port to connect       */
struct sockaddr_in toAddr;            /* an Internet endpoint address    */
char    buf[BUFLEN+1];                   /* buffer for one line of text    */
SOCKET    sock;                          /* socket descriptor            */
int    cc;                                /* recv character count            */
char    *pts;                    /* pointer to time string            */
time_t    now;                    /* current time                        */

int    toAddrsize = sizeof(toAddr);

WSADATA wsadata;
WSAStartup(WSVERS, &wsadata);       /* 启动某版本Socket的DLL        */

sock = socket(PF_INET, SOCK_DGRAM,IPPROTO_UDP);

memset(&toAddr, 0, sizeof(toAddr));
toAddr.sin_family = AF_INET;
toAddr.sin_port = htons((u_short)atoi(service));    //atoi:把ascii转化为int. htons:主机序(host)转化为网络序(network), s--short
toAddr.sin_addr.s_addr = inet_addr(host);           //如果host为域名,需要先用函数gethostbyname把域名转化为IP地址

//    memset(buf,' ',1000);  //fill 1000 bytes with 'e'
buf[1000] = '\0';
(void) time(&now);                                      // 取得系统时间
pts = ctime(&now);                                      // 把时间转换为字符串
//    memcpy(buf,pts,strlen(pts));
sprintf(buf,"%s ",pts);
printf("                        UDP(Client) Echo增强程序\n\n");
printf("  时间 :%s",buf);

cc = sendto(sock, buf, 1000, 0,(SOCKADDR *)&toAddr, sizeof(toAddr));
flag2:   if (cc == SOCKET_ERROR){
printf("发送失败,错误号:%d\n", WSAGetLastError());
}
else{
printf("       发送成功 \n");
cc = recvfrom(sock, buf, BUFLEN, 0, (SOCKADDR *)&toAddr, & toAddrsize);
printf(" 您接收到的数据为:\n %s \n",buf);
printf("键入 # 继续发送,键入 @ 停止发送\n");
scanf("%s",pts);
if(pts[0]=='#')
{
printf("    请输入要发送的数据 :\n");
goto flag1;
}
if(pts[0]=='@')
goto end;

}

flag1:
scanf("%s",pts);
sprintf(buf,"%s ",pts);
cc = sendto(sock, buf, 1000, 0,(SOCKADDR *)&toAddr, sizeof(toAddr));

goto flag2;

getchar();

closesocket(sock);

end:    GlobalFree(buf);
WSACleanup();                     /* 卸载某版本的DLL */

getchar();

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: