tcp网络编程(C语言)

Python028

tcp网络编程(C语言),第1张

以下是两个文件.client.c和server.c

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

}