Changeset 4538 for pjproject/trunk/pjlib/src/pj/sock_common.c
- Timestamp:
- Jun 19, 2013 9:06:55 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjlib/src/pj/sock_common.c
r4343 r4538 1080 1080 1081 1081 1082 /* 1083 * Adjust socket send/receive buffer size. 1084 */ 1085 PJ_DEF(pj_status_t) pj_sock_setsockopt_sobuf( pj_sock_t sockfd, 1086 pj_uint16_t optname, 1087 pj_bool_t auto_retry, 1088 unsigned *buf_size) 1089 { 1090 pj_status_t status; 1091 int try_size, cur_size, i, step, size_len; 1092 enum { MAX_TRY = 20 }; 1093 1094 PJ_CHECK_STACK(); 1095 1096 PJ_ASSERT_RETURN(sockfd != PJ_INVALID_SOCKET && 1097 buf_size && 1098 *buf_size > 0 && 1099 (optname == pj_SO_RCVBUF() || 1100 optname == pj_SO_SNDBUF()), 1101 PJ_EINVAL); 1102 1103 size_len = sizeof(cur_size); 1104 status = pj_sock_getsockopt(sockfd, pj_SOL_SOCKET(), optname, 1105 &cur_size, &size_len); 1106 if (status != PJ_SUCCESS) 1107 return status; 1108 1109 try_size = *buf_size; 1110 step = (try_size - cur_size) / MAX_TRY; 1111 if (step < 4096) 1112 step = 4096; 1113 1114 for (i = 0; i < (MAX_TRY-1); ++i) { 1115 if (try_size <= cur_size) { 1116 /* Done, return current size */ 1117 *buf_size = cur_size; 1118 break; 1119 } 1120 1121 status = pj_sock_setsockopt(sockfd, pj_SOL_SOCKET(), optname, 1122 &try_size, sizeof(try_size)); 1123 if (status == PJ_SUCCESS) { 1124 status = pj_sock_getsockopt(sockfd, pj_SOL_SOCKET(), optname, 1125 &cur_size, &size_len); 1126 if (status != PJ_SUCCESS) { 1127 /* Ops! No info about current size, just return last try size 1128 * and quit. 1129 */ 1130 *buf_size = try_size; 1131 break; 1132 } 1133 } 1134 1135 if (!auto_retry) 1136 break; 1137 1138 try_size -= step; 1139 } 1140 1141 return status; 1142 } 1143 1144 1082 1145 /* Only need to implement these in DLL build */ 1083 1146 #if defined(PJ_DLL)
Note: See TracChangeset
for help on using the changeset viewer.