日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3socket编程:UDP编程

發布時間:2024/9/27 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3socket编程:UDP编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1 C/S模型—UDP

UDP處理模型

說明:

由于UDP不需要維護連接,程序邏輯簡單了很多,但是UDP協議是不可靠的,實際上有很多保證通訊可靠性的機制需要在應用層實現。

編譯運行server,在兩個終端里各開一個clientserver交互,看看server是否具有并

發服務的能力。用Ctrl+C關閉server,然后再運行server,看此時client還能否和server

系上。和前面TCP程序的運行結果相比較,體會無連接的含義。

2 案例說明:

Server.c

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<ctype.h>

#include"wrap.h"

?

#define MAXLINE 80

#define SERV_PORT 8000

?

int main(void)

{

??? struct sockaddr_in servaddr,cliaddr;

??? socklen_t cliaddr_len;

??? int sockfd;

??? char buf[MAXLINE];

??? char str[INET_ADDRSTRLEN];

??? int i,n;

??? sockfd = Socket(AF_INET,SOCK_DGRAM,0);

?

??? bzero(&servaddr,sizeof(servaddr));

??? servaddr.sin_family = AF_INET;

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

??? servaddr.sin_port = htons(SERV_PORT);

?

??? Bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

?

??? printf("Accepting connections...\n");

??? while(1) {

??????? cliaddr_len = sizeof(cliaddr);

??????? n = recvfrom(sockfd,buf,MAXLINE,0,

????????????? ?(struct sockaddr *)&cliaddr,&cliaddr_len);

??????? if(n == -1)

??????????? perr_exit("recvfrom error");

??????? printf("received from %s at PORT %d\n",

??????????? inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),

??????????? ntohs(cliaddr.sin_port));

??????? for(i = 0;i<n;i++){

??????????? buf[i] = toupper(buf[i]);

??????? }

??????? n = sendto(sockfd,buf,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));

??????? if(n== -1)

??????????? perr_exit("sendto error");

??? }

}

Client.c

#include<stdio.h>

#include<string.h>

#include<unistd.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include"wrap.h"

?

#define MAXLINE 80

#define SERV_PORT 8000

?

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

{

??? struct sockaddr_in servaddr;

??? int sockfd,n;

??? char buf[MAXLINE];

??? char str[INET_ADDRSTRLEN];

??? socklen_t servaddr_len;

???

??? sockfd = Socket(AF_INET,SOCK_DGRAM,0);

?

??? bzero(&servaddr,sizeof(servaddr));

??? servaddr.sin_family = AF_INET;

??? inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);

??? servaddr.sin_port = htons(SERV_PORT);

?

??? while(fgets(buf,MAXLINE,stdin) != NULL) {

??????? n = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&servaddr,

??????????? sizeof(servaddr));

??????? if(n == -1)

??????????? perr_exit("sendto error");

??????? n = recvfrom(sockfd,buf,MAXLINE,0,NULL,0);

??????? if(n == -1)

??????????? perr_exit("recvfrom error");

??????? Write(STDOUT_FILENO,buf,n);

??? }

???

??? Close(sockfd);

??? return 0;

}

Wrap.h

#ifndef __WRAP_H_

#define __WRAP_H_

?

void perr_exit(const char *s);

int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr);

void Bind(int fd, const struct sockaddr *sa, socklen_t salen);

void Connect(int fd, const struct sockaddr *sa, socklen_t salen);

void Listen(int fd, int backlog);

int Socket(int family, int type, int protocol);

ssize_t Read(int fd, void *ptr, size_t nbytes);

ssize_t Write(int fd, const void *ptr, size_t nbytes);

void Close(int fd);

ssize_t Readn(int fd, void *vptr, size_t n);

ssize_t Writen(int fd, const void *vptr, size_t n);

static ssize_t my_read(int fd, char *ptr);

ssize_t Readline(int fd, void *vptr, size_t maxlen);

?

#endif

Wrap.c

#include <stdlib.h>

#include <errno.h>

#include <sys/socket.h>

?

void perr_exit(const char *s)

{

???????? perror(s);

???????? exit(1);

}

?

int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr)

{

???????? int n;

?

again:

???????? if ( (n = accept(fd, sa, salenptr)) < 0) {

?????????????????? if ((errno == ECONNABORTED) || (errno == EINTR))

??????????????????????????? goto again;

?????????????????? else

??????????????????????????? perr_exit("accept error");

???????? }

???????? return n;

}

?

void Bind(int fd, const struct sockaddr *sa, socklen_t salen)

{

???????? if (bind(fd, sa, salen) < 0)

?????????????????? perr_exit("bind error");

}

?

void Connect(int fd, const struct sockaddr *sa, socklen_t salen)

{

???????? if (connect(fd, sa, salen) < 0)

?????????????????? perr_exit("connect error");

}

?

void Listen(int fd, int backlog)

{

???????? if (listen(fd, backlog) < 0)

?????????????????? perr_exit("listen error");

}

?

int Socket(int family, int type, int protocol)

{

???????? int n;

?

???????? if ( (n = socket(family, type, protocol)) < 0)

?????????????????? perr_exit("socket error");

???????? return n;

}

?

ssize_t Read(int fd, void *ptr, size_t nbytes)

{

???????? ssize_t n;

?

again:

???????? if ( (n = read(fd, ptr, nbytes)) == -1) {

?????????????????? if (errno == EINTR)

??????????????????????????? goto again;

?????????????????? else

??????????????????????????? return -1;

???????? }

???????? return n;

}

?

ssize_t Write(int fd, const void *ptr, size_t nbytes)

{

???????? ssize_t n;

?

again:

???????? if ( (n = write(fd, ptr, nbytes)) == -1) {

?????????????????? if (errno == EINTR)

??????????????????????????? goto again;

?????????????????? else

??????????????????????????? return -1;

???????? }

???????? return n;

}

?

void Close(int fd)

{

???????? if (close(fd) == -1)

?????????????????? perr_exit("close error");

}

ssize_t Readn(int fd, void *vptr, size_t n)

{

???????? size_t? nleft;

???????? ssize_t nread;

???????? char?? *ptr;

?

???????? ptr = vptr;

???????? nleft = n;

???????? while (nleft > 0) {

?????????????????? if ( (nread = read(fd, ptr, nleft)) < 0) {

??????????????????????????? if (errno == EINTR)

???????????????????????????????????? nread = 0;

??????????????????????????? else

???????????????????????????????????? return -1;

?????????????????? } else if (nread == 0)

??????????????????????????? break;

?

?????????????????? nleft -= nread;

?????????????????? ptr += nread;

???????? }

???????? return n - nleft;

}

?

ssize_t Writen(int fd, const void *vptr, size_t n)

{

???????? size_t nleft;

???????? ssize_t nwritten;

???????? const char *ptr;

?

???????? ptr = vptr;

???????? nleft = n;

???????? while (nleft > 0) {

?????????????????? if ( (nwritten = write(fd, ptr, nleft)) <= 0) {

??????????????????????????? if (nwritten < 0 && errno == EINTR)

???????????????????????????????????? nwritten = 0;

??????????????????????????? else

???????????????????????????????????? return -1;

?????????????????? }

?

?????????????????? nleft -= nwritten;

?????????????????? ptr += nwritten;

???????? }

???????? return n;

}

static ssize_t my_read(int fd, char *ptr)

{

???????? static int read_cnt;

???????? static char *read_ptr;

???????? static char read_buf[100];

?

???????? if (read_cnt <= 0) {

again:

?????????????????? if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {

??????????????????????????? if (errno == EINTR)

???????????????????????????????????? goto again;

??????????????????????????? return -1;

?????????????????? } else if (read_cnt == 0)

??????????????????????????? return 0;

?????????????????? read_ptr = read_buf;

???????? }

???????? read_cnt--;

???????? *ptr = *read_ptr++;

???????? return 1;

}

?

ssize_t Readline(int fd, void *vptr, size_t maxlen)

{

???????? ssize_t n, rc;

???????? char??? c, *ptr;

?

???????? ptr = vptr;

???????? for (n = 1; n < maxlen; n++) {

?????????????????? if ( (rc = my_read(fd, &c)) == 1) {

??????????????????????????? *ptr++ = c;

??????????????????????????? if (c? == '\n')

???????????????????????????????????? break;

?????????????????? } else if (rc == 0) {

??????????????????????????? *ptr = 0;

??????????????????????????? return n - 1;

?????????????????? } else

??????????????????????????? return -1;

???????? }

???????? *ptr? = 0;

???????? return n;

}

?

總結

以上是生活随笔為你收集整理的3socket编程:UDP编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女网站黄页 | 亚洲色图视频在线 | 国偷自产av一区二区三区 | 国产福利资源在线 | 久久久久久久中文字幕 | 亚洲爱爱视频 | 欧美日韩激情在线一区二区三区 | 日韩激情小说 | 成熟女人毛片www免费版在线 | 清冷学长被爆c躁到高潮失禁 | 中文字幕在线播放一区二区 | 污视频导航 | 久艹伊人| 久久99网站| 在线视频免费观看你懂的 | 99久久婷婷国产综合精品草原 | 91网视频| 伊人成年综合网 | a毛片大片 | 婷婷爱五月天 | 免费看黄色的视频 | 久久av秘一区二区三区 | 久久精品视频观看 | 国产偷怕 | 不卡一二区 | 桃谷绘里香番号 | 欧美精品欧美极品欧美激情 | 久久久久久久无码 | 在线观看免费福利 | 九九视频在线免费观看 | 亚欧综合在线 | 337p亚洲精品色噜噜狠狠 | 色妞av| 毛片网站在线免费观看 | 可以在线看黄的网站 | 久热免费在线视频 | 日本三级在线 | 日本视频在线播放 | 中国女人内96xxxxx | 9.1在线观看免费 | 人人干人人舔 | 在线观看黄色免费视频 | 国产精品外围 | 男人天堂tv | 日韩av色图 | 久久99久久99精品免观看软件 | 欧美一区二区黄色 | 精品欧美乱码久久久久久1区2区 | 中文精品久久久久人妻不卡 | 免费中文字幕av | 国产传媒一级片 | 日韩福利一区二区 | 国产在线a | 国产精品成人一区 | 国产经典一区二区三区 | 草在线| 国产伦精品一区二区三区免.费 | 中国黄色在线视频 | 欧美大黑bbbbbbbbb在线 | 国产成人精品亚洲男人的天堂 | 免费性视频 | 一区免费在线观看 | 欧美日韩国产一级 | 婷婷在线一区 | 播放一级黄色片 | 夜夜嗨影院 | 欧美freesex黑人又粗又大 | 俄罗斯porn | 五月婷婷激情四射 | 美女免费网站 | 久久肉 | 亚洲视频91 | 成人mv在线观看 | 毛片视 | 超清纯大学生白嫩啪啪 | 日韩视频在线免费观看 | 欧美日韩国产综合网 | 天天鲁| 日韩三级一区二区 | 成人免费做受小说 | 青青草伊人久久 | 国产午夜成人久久无码一区二区 | 国产精品扒开腿做爽爽 | 日本一区二区三区精品视频 | 中国少妇毛片 | 成人一区二区三区 | 日本美女久久久 | 久久精品国产熟女亚洲AV麻豆 | 国产精品456| 国产乱人伦 | 亚洲熟女一区二区 | 别揉我奶头啊嗯一区二区 | xxxx96| 在线免费看毛片 | h在线网站 | 国产aa| 森泽佳奈在线播放 | 亚洲精美视频 | 成人在线欧美 |