简单的socket程序
虽然很简单,但还是调试了很长时间。本科时候接触过socket——那个帅帅的刘老师的课,现在重新再捡起来。
程序中专门建立一个FunThread线程用来接收数据,实现双向通信,也可以连续发送、连续接收。代码贴上来,如果还能保留VA View那样的颜色区别就好看了,但是试了好几遍都不行server:
#include
#define PORT 6000 //服务器端口 #define MSGSIZE 1024 //收发缓冲区的大小 #pragma comment(lib, \链接静态库
DWORD WINAPI FunThread(LPVOID); //创建一个线程,专门用来接收数据 SOCKET sClient; //连接所用套节字 SOCKET sListen; //监听套接字 SOCKADDR_IN client; //保存客户的地址信息
int iaddrSize = sizeof(SOCKADDR_IN); int main() {
WSADATA wsaData; SOCKADDR_IN local;
char s_Message[MSGSIZE]; //收发缓冲区
WSAStartup(0x0202, &wsaData); //Initialize Windows socket library
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器监听套节字。TCP协议
local.sin_family = AF_INET; //AF_INET指明使用TCP/IP协议族 local.sin_port = htons(PORT);//指明连接服务器的端口号
local.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机地址
bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));//地址绑定到套接字
listen(sListen, 1);//开始监听
sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//建立连接
printf(\ntohs(client.sin_port));
HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0);//创建接收线程 CloseHandle(hThread);
while (TRUE) {
printf(\ //从键盘输入
gets(s_Message); //发送数据
send(sClient, s_Message, strlen(s_Message), 0); }
return 0; }
DWORD WINAPI FunThread(LPVOID) {
char c_Message[MSGSIZE]; //收发缓冲区 int ret; //接收字节的个数 while (TRUE) {
ret = recv(sClient, c_Message, MSGSIZE, 0);//接收数据 if(ret==SOCKET_ERROR) {
printf(\
sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//重新开始监听
printf(\
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
memset(c_Message,0,1024);//将原来的client message归零 continue; }
c_Message[ret] = '\\0';
printf(\}
return 0;
} client:
#include
#define SERVER_ADDRESS \服务器端IP地址 #define PORT 6000 #define MSGSIZE 1024 #pragma comment(lib, \DWORD WINAPI FunThread(LPVOID);
SOCKET sClient; SOCKADDR_IN server;
int main() {
WSADATA wsaData;
char c_Message[MSGSIZE];
WSAStartup(0x0202, &wsaData);
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&server, 0,
sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0
server.sin_family =
PF_INET; //声明地址格式是TCP/IP地址格式 server.sin_port =
htons(PORT); //指明连接服务器的端口号
server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //指明连接服务器的IP地址
connect(sClient, (struct sockaddr *)&server, sizeof(SOCKADDR_IN)); //连到刚才指明的服务器上
HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0); CloseHandle(hThread); while (TRUE) {
printf(\
gets(c_Message);
send(sClient, c_Message, strlen(c_Message), 0); if(!strcmp(c_Message,\自身退出 exit(1); }
// 释放连接和进行结束工作 closesocket(sClient); WSACleanup(); return 0; }
DWORD WINAPI FunThread(LPVOID) {
char s_Message[MSGSIZE]; int ret; while (TRUE) {
ret = recv(sClient, s_Message, MSGSIZE, 0); if(ret==SOCKET_ERROR) {
printf(\ exit(1); }
s_Message[ret] = '\\0';
printf(\
if(!strcmp(s_Message,\让client退出 exit(1); }
return 0; }
程序在VC++ 6.0环境下编译通过。先运行server端,再运行client,链接建立:

