1. 程式人生 > >udp 呼叫connect函式

udp 呼叫connect函式

結論:
udp可以呼叫connect函式。
udp可以多次呼叫connect函式。

udp呼叫connect作用:
傳送端:我們不需要再次指定也不能指定埠和ip地址
接收端:不必使用類似recvfrom的函式來獲得資料報的傳送者,一個已連線的udp套接字只與一個ip地址交換資料
已連線的udp如果錯誤會返回給傳送端
udp多次呼叫connect作用:
指定一個新的ip和埠
斷開套接字

適用於udp一對一的經常不斷髮送資料的情況,可以提高效率。
比如:
未connect的udp傳送資料為,建立連線->傳送資料->斷開連線->建立連線->傳送資料->斷開連線。每次傳送報文可能要做路由查詢
connect的udp傳送資料為,建立連線->傳送資料->傳送資料->傳送資料->斷開連線。

測試程式碼:
客戶端:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    if(argc < 2){
        printf
("argument error\n"); exit(1); } char *ip = argv[1]; struct sockaddr_in server; struct sockaddr_in client; server.sin_family = AF_INET; server.sin_port = htons(atoi(argv[2])); inet_pton(AF_INET, ip, &server.sin_addr); client.sin_family = AF_INET; client.sin_port = htons(8000
); //注意本機測試可以為127.0.0.1,它是不經過網絡卡的,非本機測試必須指定為網絡卡對外的ip地址,ifconfig即可檢視。 inet_pton(AF_INET, "192.168.23.3", &client.sin_addr); int fd = socket(AF_INET, SOCK_DGRAM, 0); if(fd < 0){ printf("create socket error\n"); exit(1); } int bret = bind(fd, (struct sockaddr*)&client, sizeof(client)); if(bret == -1){ printf("bind error\n"); exit(1); } int cret = connect(fd, (struct sockaddr*)&server, sizeof(server)); if(cret == -1){ printf("connect error\n"); printf("%d\n", cret); //如果錯誤可以檢視錯誤號,並比對錶檢視錯誤 strerror(errno); printf("%d\n", errno); exit(1); }else{ printf("connect success!\n"); } char buf[1000] = "hello world"; int n = sendto(fd, buf, 1000, 0, (struct sockaddr*)&server, sizeof(server)); //int n = write(fd, buf, 1000); //int n = sendto(fd, buf, 1000, 0, NULL, 0); //int n = send(fd, buf, 1000, 0); if(n <= 0){ printf("send error\n"); } return EXIT_SUCCESS; }

服務端:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    if(argc < 2){
        printf("argument error\n");
    }
    int port = atoi(argv[2]);
    char *ip = argv[1];

    struct sockaddr_in server;
    bzero(&server, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    inet_pton(AF_INET, ip, &server.sin_addr);

    int udpfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(udpfd < 0){
        printf("socket udp socketfd error\n");
        exit(-1);
    }
    int ret = bind(udpfd, (struct sockaddr*)&server, sizeof(server));
    if(ret == -1){
        printf("bind error\n");
        exit(-1);
    }
    struct sockaddr_in client;
    socklen_t len = sizeof(client);
    char buffer[2048];
    while(1){
        bzero(buffer, 2048);
        //int n = recvfrom(udpfd, buffer, 2048, 0, (struct sockaddr*)&client, &len);
        int n = read(udpfd, buffer, 2048);

        printf("%s\n", buffer);
    }


    return EXIT_SUCCESS;
}

相關推薦

udp 呼叫connect函式

結論: udp可以呼叫connect函式。 udp可以多次呼叫connect函式。 udp呼叫connect作用: 傳送端:我們不需要再次指定也不能指定埠和ip地址

18-UDPconnect函式

1. 面向連線的UDP   在上一篇中遺留了一個問題:sendto函式產生的非同步錯誤一般是不會返回給udp套接字的(主要是因為udp是無連線的原因),如果這個錯誤要返回給udp套接字,那麼就需要呼叫connect函式。 是的,你沒看錯,udp也可以呼叫connect函式達

17.UDPconnect()函式;ICMP非同步錯誤

1.connect在UDP中的用途 [**ICMP非同步錯誤] ICMP非同步錯誤是指:傳送報文的時候,沒有錯誤;接收報文的時候,會收到ICMP應答 重點:非同步錯誤,無法返回給未連線的套接字。UDP可

UDP 呼叫 connect的作用

1:UDP中可以使用connect系統呼叫2:UDP中connect操作與TCP中connect操作有著本質區別。TCP中呼叫connect會引起三次握手,client與server建立連結.UDP中呼叫connect核心僅僅把對端ip&port記錄下來.3:UDP

UDP呼叫connect()的作用

我們都知道,UDP是無連線的,但是為什麼協議讓UDP也可以呼叫connect()? 1.因為UDP可以是一對一,多對一,一對多,或者多對多的通訊,所以每次呼叫sendto()/recvfrom()時都必須指定目標IP和埠號。通過呼叫connect()建立一個端到端的連線,就

tcp、udp connect函式的區別

1:UDP中可以使用connect系統呼叫2:UDP中connect操作與TCP中connect操作有著本質區別。TCP中呼叫connect會引起三次握手,client與server建立連結.UDP中呼叫connect核心僅僅把對端ip&port記錄下來.3:UDP中

UDP套接字上呼叫connect與在TCP上呼叫的區別

附: 我們有兩個應用程式,一個使用TCP,一個使用UDP。TCP套接字的接受緩衝區 有4096位元組的資料,UDP套接字接受緩衝區中有兩個2048位元組的資料包。TCP 應用程式呼叫read,指定其第三個引數為4096,UDP應用程式呼叫recvfrom指定其 第三個引數為

UDP中的connect函式

  1、UDP中可以使用connect系統呼叫。   2、UDP中connect操作與TCP中connect操作有著本質區別。‘   TCP中呼叫connect會引起三次握手,client與serv

udp socket 呼叫connect的作用是什麼

一般udpsocket 是不用呼叫connect函式的,那麼在什麼時候需要呼叫connect呢,或者說connect的作用是什麼呢? 套接字型別                                                           write/

TCP/UDPconnect系統呼叫

一、TCP與UDP區別        TCP保證資料正確性,UDP可能丟包;TCP保證資料順序,UDP不保證。        TCP---傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料

UDPconnect

規範 get icmp icm 約會 已連接udp套接字 自動 時間 記錄 UDP的connect沒有三次握手過程,內核只是檢測是否存在立即可知的錯誤(如一個顯然不可達的目的地), 記錄對端的的IP地址和端口號,然後立即返回調用進程。 未連接UDP套接字(unconne

C++建構函式詳解及顯示呼叫建構函式

                         

函式呼叫函式,父函式呼叫的方法,子函式重寫了,那麼最後父函式呼叫的是自己的方法,還是子函式的方法。

Q:子類呼叫父類的方法,父類中某個方法所呼叫的方法,子類也重寫了,那麼最後父類中的方法呼叫的是自己的方法,還是子類的方法。 A:呼叫的是子類的方法。     看程式碼: public class Parent { public void used

尾遞迴呼叫 高階函式 map filter reduce

#!/user/bin/env python# -*- coding:utf-8 -*-# 1.函式遞迴呼叫,函式返回值如果是另一個函式,而不是一個確切值,返回的則是這個函式的地址,需要我們加上()後才可以呼叫使用,# name="ceshi"# def hs1(x):# print(x)#

LINUX ltrace命令-用來跟蹤程序呼叫函式的情況學習

參考連結: http://www.bluestep.cc/linux-ltrace%E5%91%BD%E4%BB%A4-%E7%94%A8%E6%9D%A5%E8%B7%9F%E8%B8%AA%E8%BF%9B%E7%A8%8B%E8%B0%83%E7%94%A8%E5%BA%93%E5%87%

linux3.3核心驅動初始化時具體呼叫函式

system.map描述了程式碼具體的呼叫過程,對照這個過程,通過source-insight軟體搜尋到相應的初始化函式,整理如下: c0599ba4 t __initcall_init_static_idmapearly c0599ba4 T __initcall_start

connect函式詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

TCP與UDP協議socket函式例項理解

socket 函式 int socket(int domain, int type, int protocol) 返回值: 非負描述符為成功,-1則出錯 domain: 指明的是網路層協議族/域,通常AF_INET、AF_INET6、AF_LOCAL等 type: 套介面型別

協程中呼叫阻塞函式

from concurrent.futures import ThreadPoolExecutor from tornado import gen threadpool = ThreadPoolExecutor(2) def mySleep(count): import time