青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

厚積薄發,滴水穿石

搬家到主站了:http://www.cnblogs.com/cokecoffe/
隨筆 - 45, 文章 - 8, 評論 - 12, 引用 - 0
數據加載中……

Simple UDP code with C

The server

1 #include <arpa/inet.h>
2 #include <netinet/in.h>
3 #include <stdio.h>
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <unistd.h>
7
8 #define BUFLEN 512
9 #define NPACK 10
10 #define PORT 9930
11
12 void diep(char *s)
13 {
14 perror(s);
15 exit(1);
16 }
17
18 int main(void)
19 {
20    struct sockaddr_in si_me, si_other;
21     int s, i, slen=sizeof(si_other);
22     char buf[BUFLEN];
23
24     if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
25        diep("socket");
26
27    memset((char *) &si_me, 0, sizeof(si_me));
28     si_me.sin_family = AF_INET;
29    si_me.sin_port = htons(PORT);
30     si_me.sin_addr.s_addr = htonl(INADDR_ANY);
31   
        if (bind(s, &si_me, sizeof(si_me))==-1)
32         diep("bind");
33
34     for (i=0; i<NPACK; i++) {
35        if (recvfrom(s, buf, BUFLEN, 0, &si_other, &slen)==-1)
36              diep("recvfrom()");
37        printf("Received packet from %s:%d\nData: %s\n\n",
38        inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), buf);
39     }
40
41     close(s);
42     return 0;
43 }
Comments

Lines 8-10 define the buffer size (quite arbitrary), the number of packets to receive and the UDP port number to listen at. You could use any port number above 1023, although bind() will fail if someone else is using the same port simultaneously.
The function diep() is used for error handling.
21: Declare receive buffer.
22: sockaddr_in is a structure containing an Internet socket address. Basically, it contains:
an address family (always AF_INET for our purposes)
a port number
an IP address
si_me defines the socket where the server will listen. si_other defines the socket at the other end of the link (that is, the client).
24: Create a socket. AF_INET says that it will be an Internet socket. SOCK_DGRAM says that it will use datagram delivery instead of virtual circuits. IPPROTO_UDP says that it will use the UDP protocol (the standard transport layer protocol for datagrams in IP networks). Generally you can use zero for the last parameter; the kernel will figure out what protocol to use (in this case, it would choose IPPROTO_UDP anyway).
27: We need to initialize the si_me structure. The first step is to fill it with binary zeroes, which is done on this line. (I doubt this step is actually necessary in modern Unix implementations, but better safe than sorry.)
28: We will use Internet addresses.
29: Here, the port number is defined. htons() ensures that the byte order is correct (Host TO Network order/Short integer).
30: This line is used to tell what IP address we want to bind to. Most machines have more than one network interface (for example, 127.0.0.1 for the loopback interface and some other address for the network card; there may be more than one network card). In the general case, you want to accept packets from any interface, so you use INADDR_ANY instead of a specific address.
31: Now we are ready to bind the socket to the address we created above. This line tells the system that the socket s should be bound to the address in si_me.
35: This call says that we want to receive a packet from s, that the data should be put info buf, and that buf can store at most BUFLEN characters. The zero parameter says that no special flags should be used. Data about the sender should be stored in si_other, which has room for slen byte. Note that recvfrom() will set slen to the number of bytes actually stored. If you want to play safe, set slen to sizeof(si_other) after each call to recvfrom().
37: The information about the sender we got from recvfrom() is displayed (IP:port), along with the data in the packet. inet_ntoa() takes a struct in_addr and converts it to a string in dot notation, which is rather useful if you want to display the address in a legible form.

The client

1 #define SRV_IP "999.999.999.999"
2 /* diep(), #includes and #defines like in the server */
3
4 int main(void)
5 {
6     struct sockaddr_in si_other;
7     int s, i, slen=sizeof(si_other);
8     char buf[BUFLEN];
9
10     if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
11        diep("socket");
12
13     memset((char *) &si_other, 0, sizeof(si_other));
14     si_other.sin_family = AF_INET;
15     si_other.sin_port = htons(PORT);

16     if (inet_aton(SRV_IP, &si_other.sin_addr)==0) {
17           fprintf(stderr, "inet_aton() failed\n");
18          exit(1);
19    }
20
21     for (i=0; i<NPACK; i++) {
22        printf("Sending packet %d\n", i);
23        sprintf(buf, "This is packet %d\n", i);
24        if (sendto(s, buf, BUFLEN, 0, &si_other, slen)==-1)
25               diep("sendto()");
26 }
27
28       close(s);
29       return 0;
30 }
Note: The client is quite similar to the server. Only the differences will be discussed.

1: You need to know the IP address of the machine where the server runs. If you run the client and the server on the same machine, try 127.0.0.1. "999.999.999.999" is not a legal IP address; you need to substitute your own server's address.
12: You may call bind() after the call to socket(), if you wish to specify which port and interface that should be used for the client socket. However, this is almost never necessary. The system will decide what port and interface to use.
13-19: Here, we set up a sockaddr_in corresponding to the socket address where the server is listening. inet_aton() is used to convert a string in dotted-decimal ASCII notation to a binary address.
24: Send BUFLEN bytes from buf to s, with no flags (0). The receiver is specified in si_other, which contains slen byte.
General tips

Remember to always check return values from system calls! By doing so, you will save time in the long run, I promise. Many people do not test return values in small quick-and-dirty test programs. However, in such cases it is especially important to check return values, because if you don't really know what you are doing you are much more likely to make a mistake. The checks help you understand what went wrong and why.
There is a tool called netcat (the actual command is nc) which is very useful for testing and debugging socket code. Check the man page if you are curious (of course, it might not be installed on your system).
If you want to cut and paste the code above, use cut -c9- to get rid of the line numbers. (The exact syntax of cut may be different on your system, and you may have to remove more or less than 9 characters.)
The command netstat can be useful to check which sockets are active. Try netstat -a.
For an overview over some of the structures used in socket programming, check out the code examples from lecture 13 on my course in Unix system programming. You will also find some material on TCP programming there. Disregard the initial material on select() and friends. There are some comments in Swedish, but most of the page is written in C.

posted on 2011-11-25 22:38 Wangkeke 閱讀(601) 評論(0)  編輯 收藏 引用 所屬分類: Net


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国内精品视频一区| 国产精品视频一区二区高潮| 久久精品中文字幕一区| 欧美一区二区三区视频在线| 欧美专区日韩专区| 欧美成人午夜剧场免费观看| 欧美激情一区二区三区在线视频观看 | 亚洲精品视频在线播放| 一本大道av伊人久久综合| 亚洲欧美999| 蜜臀av性久久久久蜜臀aⅴ| 免费成人高清在线视频| 蜜臀av国产精品久久久久| 欧美日韩视频一区二区三区| 韩国欧美一区| 午夜久久黄色| 亚洲黄色尤物视频| 亚洲桃色在线一区| 久久综合亚洲社区| 亚洲午夜久久久久久尤物| 久久这里只精品最新地址| 国产精品久久久久7777婷婷| 亚洲精品1区2区| 亚洲午夜电影| 亚洲精品久久| 久久综合久久综合久久| 日韩视频在线观看| 欧美激情精品久久久六区热门 | 免费在线欧美视频| 欧美一二三视频| 最新日韩av| 亚洲已满18点击进入久久| 欧美精品不卡| 久久久久中文| 欧美在线一二三区| 一区二区三区日韩在线观看| 亚洲国产视频一区二区| 久久久久国产一区二区三区| 国内偷自视频区视频综合| 91久久国产自产拍夜夜嗨| 国产美女精品| 久久久在线视频| 欧美日韩精品一区二区天天拍小说| 最新中文字幕亚洲| 香蕉久久夜色精品国产使用方法| 国产精品网站在线| 最新成人在线| 伊人天天综合| 美女国内精品自产拍在线播放| 欧美手机在线视频| 香蕉久久国产| 欧美一区2区三区4区公司二百 | 国产精品男gay被猛男狂揉视频| 亚洲一区在线免费| 亚洲欧美影院| 樱桃成人精品视频在线播放| 亚洲一区二区成人| 中日韩男男gay无套| 欧美大尺度在线观看| 男同欧美伦乱| 在线播放中文字幕一区| 欧美影院午夜播放| 欧美在线视频日韩| 久久资源在线| 久久综合伊人| 激情自拍一区| 99riav国产精品| 国产精品女人网站| 在线一区二区三区做爰视频网站| 国产精品美女久久久久久免费 | 久久久五月天| 国产亚洲精品v| 欧美国产一区二区在线观看| 国产综合网站| 久久久久久久久一区二区| 久久黄色网页| 欧美精品尤物在线| 麻豆freexxxx性91精品| 狠狠狠色丁香婷婷综合久久五月| 久久精品99无色码中文字幕| 99精品欧美一区二区蜜桃免费| 欧美大片免费观看| 亚洲精品视频一区| 国产在线拍偷自揄拍精品| 欧美在线免费观看| 久久在线91| 国产农村妇女毛片精品久久麻豆| 亚洲国产精品成人| 一区二区三区视频在线播放| 国产精品入口尤物| 欧美一级艳片视频免费观看| 久久亚洲精品一区二区| 最近中文字幕日韩精品| 欧美日韩亚洲网| 亚洲欧美国产高清| 一区二区日韩精品| 国产精品影音先锋| 久久伊人精品天天| 久久久久久网站| 亚洲人成网站色ww在线| 欧美视频在线观看视频极品 | 亚洲国产午夜| 亚洲小说春色综合另类电影| 国产亚洲精品资源在线26u| 久久在线91| 国产精品99久久久久久久女警| 久久久亚洲综合| 一个色综合av| 激情久久久久久久| 国产精品a久久久久| 亚洲日本欧美日韩高观看| 羞羞漫画18久久大片| 在线精品高清中文字幕| 久久久xxx| 一本久道久久综合婷婷鲸鱼| 亚洲国产专区校园欧美| 欧美视频一区二区三区在线观看 | 99天天综合性| 欧美不卡高清| 性欧美xxxx视频在线观看| 亚洲欧洲日韩综合二区| 国产一区二区三区在线观看免费视频 | 欧美一区二区视频在线观看2020 | 免费在线观看日韩欧美| 亚洲第一免费播放区| 亚洲精品影视| 欧美日韩国产一级| 久久久av水蜜桃| 亚洲男人的天堂在线| 亚洲六月丁香色婷婷综合久久| 久久手机免费观看| 欧美一区二区视频在线观看2020| 一区二区三区你懂的| 亚洲大片在线| 国产一区二区三区四区hd| 国产精品欧美一区二区三区奶水| 欧美成在线观看| 美脚丝袜一区二区三区在线观看| 欧美专区在线播放| 欧美在线免费一级片| 亚洲制服丝袜在线| aⅴ色国产欧美| 艳妇臀荡乳欲伦亚洲一区| 亚洲日韩中文字幕在线播放| 欧美激情精品久久久久久大尺度 | 久久久久成人精品免费播放动漫| 在线观看一区| 一区在线免费| 一区免费观看| 在线不卡中文字幕| 亚洲承认在线| 亚洲激情啪啪| 日韩亚洲欧美综合| 日韩亚洲一区二区| 在线亚洲国产精品网站| 在线视频亚洲| 亚洲一区在线免费| 欧美中文字幕在线| 久久久久久久网| 欧美成人免费va影院高清| 中文欧美在线视频| 亚洲男人影院| 久久精品卡一| 欧美成人国产| 亚洲九九精品| 亚洲在线视频网站| 久久精品国产欧美激情| 久久一区欧美| 欧美日韩国产精品一区| 国产精品裸体一区二区三区| 国产日韩在线亚洲字幕中文| 欧美日韩国产成人在线观看| 国产精品vvv| 国内精品视频在线观看| 亚洲人线精品午夜| 亚洲欧美综合网| 久久免费视频一区| 亚洲精品久久久久久久久久久久久 | 久久国产精品一区二区三区| 欧美xx69| 亚洲午夜精品| 久久视频在线看| 欧美日韩精品综合| 韩国一区电影| 一本一道久久综合狠狠老精东影业| 午夜在线播放视频欧美| 免费成人美女女| 一区二区福利| 久久午夜电影| 国产精品久久一区二区三区| 亚洲国产精品激情在线观看| 一区二区三区在线高清| 一本色道精品久久一区二区三区| 欧美资源在线观看| 亚洲精品一区二区网址| 欧美在线亚洲一区| 国产精品成人免费精品自在线观看| 亚洲成人在线视频播放| 欧美一区二区三区在线播放| 亚洲精品日韩综合观看成人91|