1. 程式人生 > >linux socket程式設計學習

linux socket程式設計學習

socket()

  簡述:

  建立一個套介面。

#include <winsock.h>

SOCKET PASCAL FAR socket( int af, int type, int protocol);

af:一個地址描述。目前僅支援AF_INET格式,也就是說ARPA Internet地址格式。

type:新套介面的型別描述。

protocol:套介面所用的協議。如呼叫者不想指定,可用0

  註釋:

socket()函式用於根據指定的地址族、資料型別和協議來分配一個套介面的描述字及其所用的資源。如果協議

protocol未指定(等於0),則使用預設的連線方式。

  對於使用一給定地址族的某一特定套介面,只支援一種協議。但地址族可設為AF_UNSPEC(未指定),這樣的話協議引數就要指定了。協議號特定於進行通訊的通訊域。支援下述型別描述:

  型別 解釋

SOCK_STREAM 提供有序的、可靠的、雙向的和基於連線的位元組流,使用帶外資料傳送機制,為Internet地址族使用TCP

SOCK_DGRAM 支援無連線的、不可靠的和使用固定大小(通常很小)緩衝區的資料報服務,為Internet地址族使用UDP

SOCK_STREAM型別的套介面為全雙向的位元組流。對於流類套介面,在接收或傳送資料前必需處於已連線狀態。用

呼叫建立與另一套介面的連線,連線成功後,即可用recv()傳送資料。當會話結束後,呼叫closesocket()。帶外資料根據規定用send()recv()來接收。

  實現SOCK_STREAM型別套介面的通訊協議保證資料不會丟失也不會重複。如果終端協議有緩衝區空間,且資料不能在一定時間成功傳送,則認為連線中斷,其後續的呼叫也將以WSAETIMEOUT錯誤返回。

SOCK_DGRAM型別套介面允許使用recvfrom()從任意埠傳送或接收資料報。如果這樣一個套介面用connect()與一個指定埠連線,則可用send()recv()與該埠進行資料報的傳送與接收。

  返回值:

  若無錯誤發生,socket()返回引用新套介面的描述字。否則的話,返回INVAID_SOCKET錯誤,應用程式可通過WSAGetLastError()獲取相應錯誤程式碼。

  錯誤程式碼:

WSANOTINITIALISED:在使用此API之前應首先成功地呼叫WSAStartup()

WSAENETDOWNWINDOWS套介面實現檢測到網路子系統失效。

WSAEAFNOSUPPORT:不支援指定的地址族。

WSAEINPROGRESS:一個阻塞的WINDOWS套介面呼叫正在執行中。

WSAEMFILE:無可用檔案描述字。

WSAENOBUFS:無可用緩衝區,無法建立套介面。

WSAEPROTONOSUPPORT:不支援指定的協議。

WSAEPROTOTYPE:指定的協議不適用於本套介面。

WSAESOCKTNOSUPPORT:本地址族中不支援該型別套介面。

bind()

  簡述:

  將一本地地址與一套介面捆綁。

#include <winsock.h>

int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR* name,

int namelen);

s:標識一未捆綁套介面的描述字。

name:賦予套介面的地址。sockaddr結構定義如下:

struct sockaddr{

u_short sa_family;

char sa_data[14];

};

namelenname名字的長度。

  註釋:

  本函式適用於未連線的資料報或流類套介面,在呼叫前使用。當用建立套介面後,它便存在於一個名字空間(地址族)中,但並未賦名。bind()函式通過給一個未命名套介面分配一個本地名字來為套介面建立本地捆綁(主機地址/埠號)。

  在Internet地址族中,一個名字包括幾個組成部分,對於SOCK_PROGRAMSOCK_STREAM類套介面,名字由三部分組成:主機地址,協議號(顯式設定為UDPTCP)和用以區分應用的埠號。如果一個應用並不關心分配給它的地址,則可將Internet地址設定為,或將埠號置為0。如果Internet地址段為INADDR_ANY,則可使用任意網路介面;在有多種主機環境下可簡化程式設計。如果埠號置為0,則WINDOWS套介面實現將給應用程式分配一個值在10245000之間的唯一的埠。應用程式可在bind()後用來獲知所分配的地址,但必需注意的是,getsockname()只有在套介面連線成功後才會填寫Internet地址,這是由於在多種主機環境下若干種Internet地址都是有效的。

  如果一個應用程式需要把埠捆綁到超過10245000範圍的特定埠時,比如rsh需要捆綁到任一保留埠,則可如下程式設計:

SOCKADDR_IN sin;

SOCKET s;

u_short alport=IPPORT_RESERVED;

sin.sin_family=AF_INET;

sin.sin_addr.s_addr=0;

for (;;) {

sin.sin_port=htons(alport);

if (bind(s,(LPSOCKADDR)&sin, sizeof(sin))=0) {

/* it worked */

}

if (GetLastError()!=WSAEADDRINUSE) {

/* fail */

}

alport-;

if (alport=IPPORT_RESERVED/2) {

/* failall unassigned reserved ports are */

/* in use. */

}

}

  返回值:

  如無錯誤發生,則bind()返回

相關推薦

linux socket程式設計學習

socket()   簡述:   建立一個套介面。 #include <winsock.h> SOCKET PASCAL FAR socket( int af, int type, int protocol); a

《實戰 Linux Socket 程式設計》Warren W.Gay 圖解Key-point學習筆記-1

第一章 套介面簡介 ————————本文為作者原創,轉載請註明出處———————— 此係列為本人的學習筆記,歡迎大家在留言區對概念進行拓展延伸、糾錯討論! 注:所有的例子程式均來自於原書,筆者親自錄入,如果有讀者有全書原始碼連結,也歡迎在評論區分享給其他讀者!!

阻塞read/write型socket網路連線弊端——緩衝區堆積——linux網路程式設計學習

情景: 自定義協議:有頭無尾,資料中可計算長度。 採用阻塞read/write傳送接收。 測試程式碼: 接收端主要部分截圖,在read()之間加sleep即可: 注意事項:如果雙工,接收端傳送反饋的write最好別再sleep之後,不然有干擾。(好像是共用緩衝區,暫時不

Linux-socket程式設計-1對1和1對多聊天

1對1聊天     通過select新增可讀事件的監聽實現。     服務端: #include "header.h" int main(void) { int listenfd = -1; int connfd = -1; struct

linux socket 程式設計總結

#include<sys/types.h> #include<sys/socket.h> int socket(int domain, int type, int protocol); domain引數 可指定的協議族

Linux應用程式設計學習記錄(五)

        現在來學習一下關於程序的一些操作。 1.  使用fork()函式建立程序 A)函式一定是在程式中被呼叫的,而呼叫fork函式的程式在執行中是一個程序。在這個程序中,執行fork的效果,是把自己完完全全複製一遍。這個新的程序是原來程序的子程序,他倆構成了父子

linux網路程式設計學習筆記(一)

目錄 1. 獲取系統呼叫錯誤資訊:errno   strerror()     perror(); 他跟c語言中的fopen()有什麼區別呢?  他也呼叫的是這個open(); 2.常規檔案操作之建立、讀、寫

Python-Socket程式設計學習(11.3)

堅持就是勝利! 下次用tkinter寫個gui介面 伺服器程式碼: #socket服務端程式碼 #匯入相應模組 import socket import sys #建立socket模組 ?引

Linux socket程式設計示例3 select函式的使用

1.select函式簡介 int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout); 當伺服器響應多個客戶端連線的時候,需要定義一個執行緒

Linux系統程式設計學習常見問題(一):VMware虛擬機器下Ubuntu18.04突然上不了網的問題解決方案

問題描述:VMware虛擬機器下Ubuntu18.04突然上不了網的問題:如下圖所示:   更改這裡的三種連線方式都是這樣  2.  分析:IP衝突或者配置出了問題,需重新更新設定。 3.  解決: (1)將模式調整為

Linux系統程式設計學習筆記

PDB的常用的除錯命令: 程式先寫完的情況的呼叫方式: 1、 python3  -m pdb test.py  #斷點的過程  b 7     ## 後面的數字是 行數  ## = 清楚斷點的

Linux Socket程式設計例項(一個Hello World程式)

在Linux下寫了個小的socket程式,分為客戶端和伺服器端,服務端開一個埠(2000),做為一個daemon,等待客戶的連線請求.一旦有客戶連線,伺服器端打印出客戶端的IP地址和埠,並且向伺服器端傳送歡迎資訊和時間.下面是服務端的程式碼(tcpserver.c).由於這只是個簡單的程式,所

linux核心程式設計學習筆記

常見問題 一、核心模組A呼叫核心模組B 檢視匯出的核心符號表 cat /proc/kallsyms | grep 'func_m2' 1、一個核心模組A呼叫另一個核心模組B的匯出函式,需要做到三點 1.模組B先載入 2.模組B函式匯出成功 3.模組B編譯後會有個Module.sy

JAVA Socket 程式設計學習

import java.io.*; import java.net.Socket; /** * 伺服器端執行緒處理類 * Created by Administrator on 2017/9/28. */ public class ServerThread extends Thread {

大三開學前,反思linux網路程式設計學習方向、方法

大三前感悟 最近,我剛剛看完《UNIX網路程式設計 卷1》,感覺應該要停一下,思考下一步應該學什麼,怎麼學。 目前已經看完《鳥叔linux》和《UNP 卷1》了。在看這兩本大塊頭的時候,心情是比較浮躁的。剛剛開始時我的熱情很高,效率也不低。然而學習一段時間,

Linux網路程式設計學習筆記(7)---5種I/O模型及select輪詢

本文主要介紹5種I/O模型,select函式以及利用select實現C/S模型。 1、5種I/O模型 (1)阻塞I/O: 一直等到資料到來,才會將資料從核心中拷貝到使用者空間中。 (2)非阻塞I/O: 每過一段時

Linux Socket程式設計(不限Linux

“一切皆Socket!” 話雖些許誇張,但是事實也是,現在的網路程式設計幾乎都是用的socket。 ——有感於實際程式設計和開源專案研究。 我們深諳資訊交流的價值,那網路中程序之間如何通訊,如我們每天開啟瀏覽器瀏覽網頁時,瀏覽器的程序怎麼與web伺服器通訊的?當你用QQ聊天時,QQ程序怎麼與伺服器或你好友所

Java Socket 程式設計學習(4)

Java 利用Socket實現UDP客戶端和伺服器端 伺服器端: ServerBean類 package yang.socket.udp; import java.io.IOException; import java.net.DatagramPacket; impo

伺服器開發之linux網路程式設計---學習章節(一)

前言:    近期學習了伺服器相關的開發,平常主要擼c的程式,所以就下定決心研究了c的伺服器開發,目的也在與鞏固c的基本知識。詳細分享如下,若有錯誤請指正,希望與大家探討,共同學習進步。                                             

Java Socket 程式設計學習(3)

Java Socket 程式設計學習,利用DatagramSocket和DatagramPacket實現UDP資料傳輸 場景描述: 客戶端建立資料包,繫結伺服器地址和埠,向伺服器傳送資料;伺服器繫結埠,從埠接受資料 伺服器程式碼: ServerBean類 package y