linux下socket程式設計例項

2021-07-02 04:48:44 字數 3800 閱讀 8115

linux下socket程式設計例項

一、基本socket函式

linux系統是通過提供套接字(socket)來進行網路程式設計的。網路的socket資料傳輸是一種特殊的i/o,socket也是一種檔案描述符。socket也有乙個類似於開啟檔案的函式:socket(),呼叫socket(),該函式返回乙個整型的socket的描述符,隨後的連線建立、資料傳輸等操作也都是通過該

socket實現。

1、socket函式

syntax:

int socket(int domain, int type, int protocol);

功能說明:

呼叫成功,返回socket檔案描述符;失敗,返回-1,並設定errno

引數說明:

domain指明所使用的協議族,通常為pf_inet,表示tcp/ip協議;

type引數指定socket的型別,基本上有三種:資料流套接字、資料報套接字、原始套接字

protocol通常賦值"0"。

socket資料結構中包含這五種資訊。

2、bind函式

syntax: 

int bind(int sock_fd,struct sockaddr_in *my_addr, int addrlen);

功能說明:

將套接字和指定的埠相連。成功返回0,否則,返回-1,並置errno.

引數說明:

sock_fd是呼叫socket函式返回值,

my_addr是乙個指向包含有本機ip位址及埠號等資訊的sockaddr型別的指標;

struct sockaddr_in結構型別是用來儲存socket資訊的:

struct sockaddr_in ;  

struct sockaddr_in s_add,c_add;

unsigned short portnum=0x8888;

printf("hello,welcome to client!\r\n");

cfd = socket(af_inet, sock_stream, 0);

if(-1 == cfd)

printf("socket fail ! \r\n");

return -1;

printf("socket ok !\r\n");

bzero(&s_add,sizeof(structsockaddr_in));

s_add.sin_family=af_inet;

s_add.sin_addr.s_addr=inet_addr("192.168.1.2");

s_add.sin_port=htons(portnum);

printf("s_addr = %#x ,port :%#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);

if(-1 == connect(cfd,(struct sockaddr*)(&s_add), sizeof(struct sockaddr)))

printf("connect fail !\r\n");

return -1;

printf("connect ok !\r\n");

if(-1 == (recbytes =read(cfd,buffer,1024)))

printf("read data fail !\r\n");

return -1;

printf("read ok\r\nrec:\r\n");

buffer[recbytes]='\0';

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

getchar();

close(cfd);

return 0;

2、server.c

#include

#include

#include

#include

#include

#include

int main()

int sfp,nfp;

struct sockaddr_in s_add,c_add;

int sin_size;

unsigned short portnum=0x8888;

printf("hello,welcome to my server!\r\n");

sfp = socket(af_inet, sock_stream, 0);

if(-1 == sfp)

printf("socket fail ! \r\n");

return -1;

printf("socket ok !\r\n");

bzero(&s_add,sizeof(structsockaddr_in));

s_add.sin_family=af_inet;

s_add.sin_addr.s_addr=htonl(inaddr_any);

s_add.sin_port=htons(portnum);

if(-1 == bind(sfp,(struct sockaddr*)(&s_add), sizeof(struct sockaddr)))

printf("bind fail !\r\n");

return -1;

printf("bind ok !\r\n");

if(-1 == listen(sfp,5))

printf("listen fail !\r\n");

return -1;

printf("listen ok\r\n");

while(1)

sin_size = sizeof(struct sockaddr_in);

nfp = accept(sfp, (struct sockaddr*)(&c_add), &sin_size);

if(-1 == nfp)

printf("accept fail !\r\n");

return -1;

printf("accept ok!\r\nserver start getconnect from %#x :%#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));

if(-1 == write(nfp,"hello,welcome tomy server \r\n",32))

printf("write fail!\r\n");

return -1;

printf("write ok!\r\n");

close(nfp);

close(sfp);

return 0;

在cygwin下,使用gcc命令編譯如下:

gcc -o server server.c

gcc -o client client.c

然後執行程式:

./server

./client

server執行效果如下:

hello,welcome to my server !

socket ok !

bind ok !

listen ok

accept ok!

server start get connect from 0xc0a80102 :0xc927

write ok!

client執行效果如下:

hello,welcome to client !

socket ok !

s_addr = 0x201a8c0 ,port : 0x8888

connect ok !

read ok

rec:

hello,welcome to my server

Linux下基於C C 的Socket程式設計例項

socket程式設計例項 例項中的伺服器通過socket連線向客戶端傳送字串 hello,you are connected 只要在伺服器上執行該伺服器軟體,在客戶端執行客戶軟體,客戶端就會收到該字串。該伺服器軟體 如下 include include include include include...

linux下socket程式設計

一 什麼是socket socket可以看成是使用者程序與核心網路協議棧的程式設計介面。socket不僅可以用於本機的程序間通訊,還可以用於網路上不同主機的程序間通訊。socket api是一層抽象的網路程式設計介面,適用於各種底層網路協議,如ipv4 ipv6。struct sockaddr in...

linux下socket程式設計

作為乙個嵌入式開發者,在實際的研發專案中,常常需要編寫socket網路程式設計介面,提供給軟體開發人員。下面將提供乙個常用的 模板 客戶端的功能可以用微控制器多功能除錯助手進行驗證 include include include include include include include def...