server.c
client.c
运行效果如下
这是个标准的SOCKET客户端代码你哪里不会了?难道要一行一行的注释?
我给你简单解释一下SOCKET编程的模型吧:
服务器 socket 函数 返回 描述符 fd
bind fd到相关的ip地址和端口
listen
最后accept 阻塞 等待客户端的链接
客户端 client
socket 函数 返回描述符 fd
直接 connect 到固定ip地址和端口的 服务器
当connect的服务器正在accpet 那么
服务器accept会返回一个 fd
这个时候 服务器就可以通过这个fd和客户端进行通信
客户端connnect成功后,就可以通过自己的fd和服务器进行通信
上面是一个标准的socket通信模型
如果看懂了 那就好
否则你要先弄清楚这个 才能看懂代码 而不是让别人一句一句告诉你
#include#include
#include
#pragma comment(lib,"ws2_32.lib")
typedef struct{
SOCKET accpt
int lock
}Arg
void *transfer(void *arg)
{
Arg * info = (Arg *)arg
SOCKET clientSock
char recvbuf[102]
char sendBuf[] = "10"
int ret
memcpy(&clientSock,(void*)&info->accpt,sizeof(clientSock))
info->lock =1
while (TRUE)
{
ret = send(clientSock,sendBuf,2,0)
if (ret == -1)
{
break
}
ret = recv(clientSock,recvbuf,102,0)
printf("%s\n",recvbuf)
}
return (void *)0
}
void* timer(void *arg)
{
time_t last = time(NULL)
time_t now
int i = 20
while(i--)
{
now = time(NULL)
if(now - last == 1)
{
printf("1s past!\n")
last = now
}
Sleep(500)
}
printf("timer exit.\n")
return (void *)0
}
int main(void) {
WSADATA wsaData
SOCKET ListenSocket
SOCKADDR_IN service,client
int len = sizeof(client)
Arg argument
pthread_t tid
char sendBuf[] = "ID=2WHAT=host"
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData)
if (iResult != NO_ERROR) {
printf("Error at WSAStartup()\n")
return 1
}
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError())
WSACleanup()
return 1
}
service.sin_family = AF_INET
service.sin_addr.s_addr = inet_addr("127.0.0.1")
service.sin_port = htons(27115)
if (bind( ListenSocket,
(SOCKADDR*) &service,
sizeof(service)) == SOCKET_ERROR) {
printf("bind() failed.\n")
closesocket(ListenSocket)
WSACleanup()
return 1
}
if (listen( ListenSocket, 1 ) == SOCKET_ERROR) {
printf("Error listening on socket.\n")
closesocket(ListenSocket)
WSACleanup()
return 1
}
argument.lock = 1
printf("Waiting for client to connect...\n")
pthread_create(&tid,NULL,timer,NULL)
while(TRUE){
argument.accpt = accept( ListenSocket, (SOCKADDR*)&client, &len )
if (argument.accpt == INVALID_SOCKET) {
printf("accept failed: %d\n", WSAGetLastError())
closesocket(ListenSocket)
WSACleanup()
return 1
} else {
printf("accept%s:%d\n",inet_ntoa(client.sin_addr),client.sin_port)
while (!argument.lock)
argument.lock = 0
// sendto(argument.accpt,sendBuf,sizeof(sendBuf),0,(SOCKADDR*)&client,len)
pthread_create(&tid,NULL,transfer,&argument)
//send(AcceptSocket,sendBuf,sizeof(sendBuf),0)
}
}
// No longer need server socket
closesocket(ListenSocket)
WSACleanup()
return 0
}