1、socket
每一條TCP連接兩個端點,TCP連接的端點交錯socket socket=(IP地址:端口號)―――>標示了網絡上唯一的一個進程 每一條TCP連接被兩個socket(即socket pair)唯一的確定。 TCP連接={socket1,socket2}={{IP1,port1},{IP2,port2}}2、網絡字節序 1)大端:大端放在該值的起始地址;一個數據的高字節放在起始地址2)小端:小端放在該值的起始地址;一個數據的低字節放在起始地址3)數組:數組元素是按照元素個數開辟完空間,將第一個元素放在低地址,而第一個元素如果是大端,就將其高字節放在元素的起始地址處
4)網絡字節序 網絡字節序是大端的,讀的時候認為讀到的第一個字節是高字節;所以小端要轉換成大端
發數據:從低地址――>高地址 ;收數據:從低地址――>高地址 主機字節序――網絡字節序 網絡字節序――主機字節序3、socket地址的數據類型
各種socket地址結構體的開頭都是相同的,前16位表示整個結構體的長度(並不是所有UNIX的實現 都有長度字段,如Linux就沒有),後16位表示地址類型。
4、TCP 幾個需要注意的點: 1)socket中的數據格式是:SOCK_STREAM 2) bind之前需要將容器struct sockaddr_in 進行初始化: 端口號:將主機序列轉成網絡序列; IP地址:字符串轉成整形 3)int listen(sockfd,backlog) 需要了解backlog是什麼意思 listen狀態下可以監聽多個client,所以可以backlog個client處於連接等待狀態,超過 backlog個的就忽略
4)accept()用於被動等待連接,其中有兩個參數需要注意 int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen) addr:是一個傳出參數,該函數返回時,將client的端口號和IP地址填充進去如果 addr=NULL,表示不關心addr的地址 addrlen:是一個傳入傳出參數,進去的時候是定義的addr結構體的大小,傳出的是實 際client的addr 的大小(有可能實際的小於定義的) 5)client端不需要bind函數去綁定,也不建議bind,但是常規上是可以bind的 6)connect連接的時候填充的是server的地址代碼1:單server――單client
1)server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
const short _PORT=8080;
#define _IP "127.0.0.1"
int main()
{
//1.create socket
int listenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0)
{
perror("socket");
return 1;
}
//2.1initial sockaddr_in
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(_PORT);
local.sin_addr.s_addr=inet_addr(_IP);
if(bind(listenfd,(struct sockaddr*)&local,sizeof(local))<0)
{
perror("bind");
return 2;
}
int ret=listen(listenfd,5);
if(ret<0)
{
perror("listen");
return 3;
}
while(1)
{
struct sockaddr_in peer;
socklen_t len=sizeof(peer);
int fd=accept(listenfd,(struct sockaddr *)&peer,&len);
if(fd<0)
{
perror("accept");
return 4;
}
else{
char buf[1024];
while(1)
{
memset(buf,'\0',1024);
ssize_t _s=read(fd,buf,sizeof(buf)-1);
if(_s>0)
{
//printf("client# %s",buf);
buf[_s]='\0';
write(fd,buf,sizeof(buf)-1);
printf("client# %s",buf);
// write(fd,buf,sizeof(buf)-1);
}
else if(_s==0)
{
printf("read done ...\n");
break;
}
else{
break;
}
}
close(fd);
break;
}
}
return 0;
}
2)client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
const short _PORT=8080;
const char *_IP="127.0.0.1";
int main()
{
//1creat socket
int fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<0)
{
perror("socket");
return 1;
}
struct sockaddr_in remote;
remote.sin_family=AF_INET;
remote.sin_port=htons(_PORT);
remote.sin_addr.s_addr=inet_addr(_IP);
int ret=connect(fd,(struct sockaddr *)&remote,sizeof(remote));
if(ret<0)
{
perror("connect");
return 2;
}
char buf[1024];
while(1)
{
memset(buf,'\0',sizeof(buf));
printf("Please Enter:\n");
ssize_t _s=read(0,buf,sizeof(buf)-1);
if(_s>0)
{
buf[_s]='\0';
write(fd,buf,strlen(buf));
memset(buf,'\0',sizeof(buf));
ssize_t _ss=read(fd,buf,sizeof(buf)-1);
if(_ss>0)
{
buf[_ss]='\0';
printf("%s",buf);
}
else
{
break;
}
}
}
return 0;
}
本文出自 “momo就是辣麼萌” 博客,請務必保留此出處http://momo462.blog.51cto.com/10138434/1831198