基於linux,該實例實現了服務端傳了一個hello world給客戶端。
socket()創建socket
bind()綁定socket到IP地址和端口
listen()服務器監聽客戶端的連接
connect()客戶端連接到服務器
accept()應用程序接受完成3次握手的客戶端連接
send() recv() write() read()機器間相互發送數據
close() 關閉socket
gethostbyname() gethostbyaddr() V4專有
select() poll() 處理多個連接的讀、寫和錯誤狀態
getsockopt()得到對應socket的選項值
setsockopt()設置對應socket的選項值
具體代碼如下:
服務端部分:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv)
{
char hello[] = "hello world";
struct sockaddr_in sa;
int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (-1 == SocketFD) {
perror("cannot create socket");
exit(EXIT_FAILURE);
}
memset(&sa, 0, sizeof sa);
sa.sin_family = AF_INET;
sa.sin_port = htons(2222);
sa.sin_addr.s_addr = htonl(INADDR_ANY);
if (-1 == bind(SocketFD, (struct sockaddr*)&sa, sizeof sa)) {
perror("bind failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
if (-1 == listen(SocketFD, 10)) {
perror("listen failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
for (;;) {
int ConnectFD = accept(SocketFD, NULL, NULL);
if (0 > ConnectFD) {
perror("accept failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
int writeSize = 0;
size_t totalWrite = 0;
while (totalWrite < sizeof(hello)) {
writeSize =
write(ConnectFD, hello + totalWrite, sizeof(hello) - totalWrite);
if (-1 == writeSize) {
perror("write failed");
close(ConnectFD);
close(SocketFD);
exit(EXIT_FAILURE);
}
totalWrite += writeSize;
}
if(-1==shutdown(ConnectFD,SHUT_RDWR)){
perror("shutdown failed");
close(ConnectFD);
close(SocketFD);
exit(EXIT_FAILURE);
}
close(ConnectFD);
}
close(SocketFD);
return EXIT_SUCCESS;
}
客戶端部分:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv)
{
char hello[] = "hello world";
struct sockaddr_in sa;
int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (-1 == SocketFD) {
perror("cannot create socket");
exit(EXIT_FAILURE);
}
memset(&sa, 0, sizeof sa);
sa.sin_family = AF_INET;
sa.sin_port = htons(2222);
res = inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr);
if (-1 == connect(SocketFD, (struct sockaddr*)&sa, sizeof sa)) {
perror("connect failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
char buffer[512];
int totalRead = 0;
for (;;) {
int readSize = 0;
readSize = read(SocketFD, buffer + totalRead, sizeof(buffer) - totalRead);
if (readSize == 0) {
break;
}
else if (readSize == -1) {
perroe("read failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
totalRead += readSize;
}
buffer[totalRead] = 0;
printf("get from server:%s\n", buffer);
(void)shutdown(SocketFD, SHUT_RDWR);
close(SocketFD);
return EXIT_SUCCESS;
}
客戶端和服務端哪一邊主動的調用了close函數,哪一邊進入TIME_WAIT