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、運行