基于socket简易聊天程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单的socket程序

2010-01-13 22:18

虽然很简单,但还是调试了很长时间。本科时候接触过socket——那个帅帅的刘

老师的课,现在重新再捡起来。

程序中专门建立一个FunThread线程用来接收数据,实现双向通信,也可以连续发送、连续接收。代码贴上来,如果还能保留VA View那样的颜色区别就好看

了,但是试了好几遍都不行

server:

#include

#include

#define PORT 6000 //服务器端口

#define MSGSIZE 1024 //收发缓冲区的大小

#pragma comment(lib, "ws2_32.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("Accepte client:%s:%d\n", inet_ntoa(client.sin_addr),

ntohs(client.sin_port));

HANDLE hThread=CreateThread(NULL,0,FunThread,0,0,0);//创建接收线程CloseHandle(hThread);

while (TRUE)

{

printf("Server Send:");

//从键盘输入

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("\nclient is closed!");

sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//重新开始监听

printf("\nAccepte new client:%s:%d", inet_ntoa(client.sin_addr), ntohs(client.sin_port));

memset(c_Message,0,1024);//将原来的client message归零

continue;

}

c_Message[ret] = '\0';

printf("\nReceived: %s\n", c_Message);

}

return 0;

}

client:

#include

#include

#define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址

#define PORT 6000

#define MSGSIZE 1024

#pragma comment(lib, "ws2_32.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("Client Send:");

gets(c_Message);

相关文档
最新文档