Linux-Soket網絡編程及套接字(服務器發給客戶端)

1、socket函數

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

功能說明:
調用成功,返回socket文件描述符;失敗,返回一1,並設置errno
參數說明:
domain指明所使用的協議族,通常爲PF_INET,表示TCP引P協議;
呼pe參數指定sket的類型,基本上有三種:數據流套接字、數據報套接字、原始套接字
protocol通常賦值"0"
兩個網絡程序之間的一個網絡連接包括五種信息:通信協議、本地協議地址、本地主機端口、
遠端主機地址和遠端協議端口。sket數據結構中包含這五種信息。

2、bind函數

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

功能說明:
將套接字和指定的端口相連。成功返回0,否則,返回一1,並置errno
參數說明;
sock_fd:是調用soet函數返回值,
my_addr:是一個指向包含有本機舊地址及端口號等信息的sockaddr類型的指針;
struct sockaddr_in:結構類型是用來保存socket信息的:
struct sockaddr_in{
short int sinfamily;
unsigned short int sin_port,
struct in_addr sin_addr;
unsigned char sin_zero[8J;
};addrlen爲sockaddr的長度。

3、connect函數

syntax:int connect(int sock_fd, struct sock_addr *serv_addr,int addrlen);

功能說明:
客戶端發送服務請求。成功返回0,否則返回一1,並置errno
參數說明:
sock_fd:是socket函數返回的socket描述符;
serv_addr:是包含遠端主機舊地址和端口號的指針;
addrlen:是結構sockaddr_in的長度。

4、listen函數

syntax:int listen(int sockfd,int backlog);

功能說明:
等待指定的端口的出現客戶端連接。調用成功返回0,否則,返回一1,並置errno。
參數說明:
sock_fd :是socket()函數返回值;
backlog:指定在請求隊列中允許的最大請求數。

5、accecpt函數

syntax:int accept(int sock_fd,struct sockaddr_in *addr,int addrlen);

功能說明:
用於接受客戶端的服務請求,成功返回新的套接字描述符,失敗返回一1,並Werrno
參數說明:
sock_fd:是被監聽的socket描述符,
addr:通常是一個指向soaddr.一in變量的指針,
addrlen:是結構sockaddr_in的長度。

6、write函數

syntax:ssize_t write(int fd,const void *buf, size_t nbytes)

功能說明:
write函數將buf中的nbytes字節內容寫入文件描述符fd成功時返回寫的字節數,失敗時返回
並設置err變量。
在網絡程序中,當我們向套接字文件描述符寫時有倆種可能:
1)write的返回值大於0,表示寫了部分或者是全部的數據·
2)返回的值小於0,此時出現了錯誤需要根據錯誤類型來處理
如果錯誤爲曰NTR表示在寫的時候出現了中斷錯誤,
如果錯誤爲EPIPE表示網絡連接出現了問題

7、read函數

syntax:ssizet read(int fd, void*buf,size_tnbyte)

函數說明:
read函數是負責從fd中讀取內容.當讀成功時,read返回實際所讀的字節數,如果返回的值是0
表示已經讀到文件的結束了,小於0表示出現了錯誤
如果錯誤爲日NTR說明讀是由中斷引起的,
如果錯誤是ECONNREST表示網絡連接出了問題

8、close函數

syntax:int close(sock_fd);

說明:
當所有的數據操作結束以後,你可以調用close()函數來釋放該so酞et,從而停止在該
socket上的任何數據操作:
函數運行成功返回0,否則返回·1。

9、socket流程

在這裏插入圖片描述
10、tcp_server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

void Error_Func(char* ErrorMessage);
int main(int argc,char* argv[])
{
	int serv_sock;
	int clnt_sock;
	
	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;

	char message[] = "hello world";

	if(argc != 2)
	{
		printf("Usage : %s <port> \n",argv[0]);
		exit(1);
	}

	serv_sock = socket(AF_INET,SOCK_STREAM,0);
	if(serv_sock == -1)
		Error_Func("socket() error");

	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serv_addr.sin_port = htons(atoi(argv[1]));

	if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
		Error_Func("bind() error");

	if(listen(serv_sock,5) == -1)
		Error_Func("listen() error");

	clnt_addr_size = sizeof(clnt_addr);
	clnt_sock = accept(serv_sock,(struct sockaddr*) &clnt_addr,&clnt_addr_size);
	if(clnt_sock = -1)
		Error_Func("accept error()");

	write(clnt_sock,message,sizeof(message));

	close(clnt_sock);
	close(serv_sock);

	return 0;
}
void Error_Func(char* ErrorMessage)
{
	fputs(ErrorMessage,stderr);
	fputc('\n',stderr);
	exit(1);
}

11、tcp_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

void Error_Func(char* ErrorMessage);
int main(int argc,char* argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[100];
	int str_len;
	if(argc != 3)
	{
		printf("Usage : %s <IP> <port>",argv[0]);
	}
	
	sock = socket(PF_INET,SOCK_STREAM,0);
	if(sock == -1)
		Error_Func("socket() error");
	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
	serv_addr.sin_port = htons(atoi(argv[2]));

	if(connect(sock,(struct sockaddr*) &serv_addr,sizeof(serv_addr)) == -1)
		Error_Func("connect() error");

	str_len = read(sock,message,sizeof(message)-1);
	if(str_len == -1)
		Error_Func("read() error");
	
	printf("Message From Server:%s\n\n",message);
	
	char toServer[] = "I am client";
	if(write(sock,toServer,sizeof(toServer)) == -1)
		Error_Func("write() error");
	
	close(sock);
	return 0;
}
void Error_Func(char* ErrorMessage)
{
	fputs(ErrorMessage,stderr);
	fputc('\n',stderr);
	exit(1);
}

12、編譯

gcc tcp_server.c -o tcp_server
gcc tcp_client.c -o tcp_client 

13、運行
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章