c语言大作业答辩是什么,本人大四在做毕设,马上答辩。急需知道下面这段程序的作用,忘高手前来帮助啊...

已结贴√

问题点数:20 回复次数:7

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

本人大四在做毕设,马上答辩。急需知道下面这段程序的作用,忘高手前来帮助啊

我的c语言基础为0000000

/*

* SSSSimpleSocketServerTask()

*

* This MicroC/OS-II thread spins forever after first establishing a listening

* socket for our sss connection, binding it, and listening. Once setup,

* it perpetually waits for incoming data to either the listening socket, or

* (if a connection is active), the sss data socket. When data arrives,

* the approrpriate routine is called to either accept/reject a connection

* request, or process incoming data.

*/

void SSSSimpleSocketServerTask()

{

int fd_listen, max_socket;

struct sockaddr_in addr;

static SSSConn conn;

fd_set readfds;

/*

* Sockets primer...

* The socket() call creates an endpoint for TCP of UDP communication. It

* returns a descriptor (similar to a file descriptor) that we call fd_listen,

* or, "the socket we're listening on for connection requests" in our sss

* server example.

*/

if ((fd_listen = socket(AF_INET, SOCK_STREAM, 0)) < 0)

{

alt_NetworkErrorHandler(EXPANDED_DIAGNOSIS_CODE,"[sss_task] Socket creation failed");

}

/*

* Sockets primer, continued...

* Calling bind() associates a socket created with socket() to a particular IP

* port and incoming address. In this case we're binding to SSS_PORT and to

* INADDR_ANY address (allowing anyone to connect to us. Bind may fail for

* various reasons, but the most common is that some other socket is bound to

* the port we're requesting.

*/

addr.sin_family = AF_INET;

addr.sin_port = htons(SSS_PORT);

addr.sin_addr.s_addr = INADDR_ANY;

if ((bind(fd_listen,(struct sockaddr *)&addr,sizeof(addr))) < 0)

{

alt_NetworkErrorHandler(EXPANDED_DIAGNOSIS_CODE,"[sss_task] Bind failed");

}

/*

* Sockets primer, continued...

* The listen socket is a socket which is waiting for incoming connections.

* This call to listen will block (i.e. not return) until someone tries to

* connect to this port.

*/

if ((listen(fd_listen,1)) < 0)

{

alt_NetworkErrorHandler(EXPANDED_DIAGNOSIS_CODE,"[sss_task] Listen failed");

}

/* At this point we have successfully created a socket which is listening

* on SSS_PORT for connection requests from any remote address.

*/

sss_reset_connection(&conn);

printf("[sss_task] Simple Socket Server listening on port %d\n", SSS_PORT);

while(1)

{

/*

* For those not familiar with sockets programming...

* The select() call below basically tells the TCPIP stack to return

* from this call when any of the events I have expressed an interest

* in happen (it blocks until our call to select() is satisfied).

*

* In the call below we're only interested in either someone trying to

* connect to us, or data being available to read on a socket, both of

* these are a read event as far as select is called.

*

* The sockets we're interested in are passed in in the readfds

* parameter, the format of the readfds is implementation dependant

* Hence there are standard MACROs for setting/reading the values:

*

*   FD_ZERO  - Zero's out the sockets we're interested in

*   FD_SET   - Adds a socket to those we're interested in

*   FD_ISSET - Tests whether the chosen socket is set

*/

FD_ZERO(&readfds);

FD_SET(fd_listen, &readfds);

max_socket = fd_listen+1;

if (conn.fd != -1)

{

FD_SET(conn.fd, &readfds);

if (max_socket <= conn.fd)

{

max_socket = conn.fd+1;

}

}

select(max_socket, &readfds, NULL, NULL, NULL);

/*

* If fd_listen (the listening socket we originally created in this thread

* is "set" in readfs, then we have an incoming connection request. We'll

* call a routine to explicitly accept or deny the incoming connection

* request (in this example, we accept a single connection and reject any

* others that come in while the connection is open).

*/

if (FD_ISSET(fd_listen, &readfds))

{

sss_handle_accept(fd_listen, &conn);

}

/*

* If sss_handle_accept() accepts the connection, it creates *another*

* socket for sending/receiving data over sss. Note that this socket is

* independant of the listening socket we created above. This socket's

* descriptor is stored in conn.fd. If conn.fs is set in readfs... we have

* incoming data for our sss server, and we call our receiver routine

* to process it.

*/

else

{

if ((conn.fd != -1) && FD_ISSET(conn.fd, &readfds))

{

sss_handle_receive(&conn);

}

}

} /* while(1) */

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值