linux下socket编程(服务器端)
流程1:添加socket监听
int listenfd=socket(AF_INET,SOCK_STREAM,0);
//AF_INET:address family_internet(地址族网络)
//SOCK_STREAM:socket_stream(SOCKET流)
//0:一般都写0
流程2:注册sockaddr_in
由于socketaddr_in的内存分配较socketaddr好所以使用sockaddr_in声明变量使用时可以将sockaddr_in强转乘sockaddr
htonl可以将数字转换成大端存储的方式,因为正常输入的方式为小端。如0x12345678转换后为0x78563412
long htonl(long n){
return (n<<24)|((n<<8)&0x00FF0000|(n>>8)&0x0000FF00|(n>>24&0x000000FF));
}
由于部分linux机器下0x12345678<<24的结果可能是0x78123456但window下的结果一定是0x78000000所以为了安全起见需要:
long htonl(long n){
return (n<<24&0xFF000000)|((n<<8)&0x00FF0000|(n>>8)&0x0000FF00|(n>>24&0x000000FF));
}
socketaddr_in sockaddr;
sockaddr_in sockaddr;
memset(&sockaddr,0,sizeof(sockaddr));
sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htonl(atoi(argv[1]));
流程3:bind绑定
bind(listenfd,(struct sockaddr*)&sockaddr,sizeof(sockaddr));
流程4:设置为监听模式
listen(listenfd,0);
流程5:接受客户端连接
int clientlen;
int clientfd=accept(listenfd,(struct sockaddr*)sockaddr,(socklen_t*)&clientlen);
流程6:send发送
char buffer[1<<10];
send(clientfd,buffer,strlen(buffer),0);
流程7:recv接受
recv(clientfd,buffer,sizeof(buffer),0);
对于异常的情况会返回-1(send,recv可能会返回0),可能通过perror(" ")打印出来
图形编程
//设置光标位置
void pos(int x,int y)
{
COORD posPoint = {x,y}; //设置坐标
SetConsoleCursorPosition(hOut,posPoint);
}
void blue_border()//蓝色字体
{
WORD blue=FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN;//设置字
体颜色、背景颜色
SetConsoleTextAttribute(hOut,blue);//字体样式
}
void white_back()//还原亮白色字体
{
WORD white=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;
SetConsoleTextAttribute(hOut,white);
}
void cyan_choose()//青色字体
{
WORD cyan=FOREGROUND_GREEN|FOREGROUND_INTENSITY|BACKGROUND_GREEN|BACKGROUND_BLUE;
SetConsoleTextAttribute(hOut,cyan);
}
void on_Select()//被选中时的样式
{
WORD select=FOREGROUND_GREEN|FOREGROUND_INTENSITY|BACKGROUND_RED;
SetConsoleTextAttribute(hOut,select);
}
void onChoose(int x,int y)//确定所选中的位置
{
if(x==25&&y==10)
{
on_Select();
cout<<"1. 开始 ";
}
else if(x==25&&y==20)
{
on_Select();
cout<<"3. 继续 ";
}
else if(x==65&&y==10)
{
on_Select();
cout<<"2. 选择 ";
}
else if(x==65&&y==20)
{
on_Select();
cout<<"4. 退出 ";
}
}
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出句柄